[Developers] More information on '/type/reflect'
David Flanagan
david at davidflanagan.com
Wed May 7 22:12:01 UTC 2008
Sumit wrote:
> Hi,
> Where can I find more reference on the '/type/reflect' properties i.e.
> /type/reflect/any_master, /type/reflect/any_reverse and
> /type/reflect/any_value. I see it being used in discussions and mailing
> lists but was not able to find any info on these topics in the MQL
> tutorial or the architecture/data model notes.
As far as I know, no such documentation exists yet. I'm working on
updating the MQL tutorial to add it, however.
> Here is a case/problem that I am trying to solve
> - Given a person's name and related information like country of birth,
> profession, etc. find its freebase id.
> - The query should not rely on specific types like /location/country as
> the place associated with a persons name could be a state or city or
> county too. Same with profession, employers, etc.
>
> After poking around into lists and discussions I tried the following
> query which works, at least I think it is working. However I need to
> read up more on the '/type/reflect' to be confident.
>
> {
> "query" : [
> {
> "/type/reflect/any_master" : [
> {
> "name" : "new zealand"
> }
> ],
> "id" : [],
> "name" : "peter jackson",
> "type" : "/people/person"
> }
> ]
> }
Here are my comments on this query:
1) Queries of the id property always return a single value, even when an
object has more than one possible id. So you can safely use "id":null
2) When you use a /type/reflect property, you find any property with the
value you've specified. If you're interested in the name of the
property that has been matched, add "link":null to the clause.
3) For the kind of generic search you're attempting here, it may not be
sufficient to just use /type/reflect/any_master. That will only find
outgoing links to other objects. It won't find incoming links, and it
won't find properties that refer to a value rather than to an object.
(So if "new zealand" was a value of /type/text rather than a
/location/country object, it wouldn't be found. And suppose that
/location/country had a "famous_person_born_here" property and that this
was a master property, with its reverse being
/people/person/countries_claiming_this_person. Your query using
any_master wouldn't find a link like that between Peter Jackson and New
Zealand because it is not a master property of /people/person.
So here's how you might alter your query
[{
"/type/reflect/any_master" : [{
"link":null,
"name":"new zealand"
}],
"/type/reflect/any_reverse" : [{
"link":null,
"name":"new zealand",
"optional":true
}],
"/type/reflect/any_value" : [{
"link":null,
"value":"new zealand"
}],
"id" : null,
"name" : "peter jackson",
"type" : "/people/person"
}]
Actually, however, the any_value portion of this query doesn't work: it
won't let me specify a value for the "value" property, only query it
with null. I don't know if this is a bug or a legitimate restriction,
so you either have to query all values of /type/text and see if any of
them are country names or drop that clause from your query.
If you really do care about searching reverse properties as well as
outgoing properties, then the problem with the query above is that
you've got to put optional:true in both clauses, and you'll get lots of
results that don't match either clause. A better way (also not yet
documented) perhaps to do this is to query the links between objects:
[{
"type":"/type/link",
"source": {
"type":"/people/person",
"name":"peter jackson",
"id":null
},
"target": {"name":"new zealand"},
"master_property":null,
"reverse":null
}]
This says: "Return the id of a person named peter jackson who has an
outgoing or incoming link to or from something named "new zealand".
Also return the master property name for the link and tell me whether
the link was reversed in this case."
Here's a version that looks for links to New Zealand or Screenwriter:
[{
"type":"/type/link",
"source": {
"type":"/people/person",
"name":"peter jackson",
"id":null
},
"target":{
"name":null,
"name|=":["new zealand","screenwriter"]
},
"master_property":null,
"reverse":null
}]
Like the /type/reflect/any_master query you started with, this
/type/link query does not find links that are to /type/text values
rather than to objects. To find those, you'd work with the target_value
property of the link instead of target.
While we're on the topic of undocumented syntax, here's a query that
says "Return the id and nationality of people named Peter Jackson but
exclude any who are nationals of any country other than New Zealand."
This gets you the person you're looking for, plus about four others who
don't have the nationality property filled in:
[{
"nationality":null,
"but:nationality":{
"optional":"forbidden",
"name!=":"New Zealand"
},
"id" : null,
"name" : "peter jackson",
"type" : "/people/person"
}]
I've written some documentation for optional:forbidden and != but it is
not published yet. Stay tuned.
Hope this helps!
David Flanagan
>
> Thanks.
> Sumit
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Developers mailing list
> Developers at freebase.com
> http://lists.freebase.com/mailman/listinfo/developers
More information about the Developers
mailing list