2014-06-22 23 views
0

我试图学习使用Freebase,但是当我尝试按“/ people/person/date_of_birth”进行排序以搜索演员的演员时,它会返回:Freebase MQL必须在一个值上排序

"code": 400, 
    "message": "Must sort on a single value, not at /tv/tv_program/regular_cast./tv/regular_tv_appearance/actor./people/person/date_of_birth" 

以下是完整的MQL查询:

[{ 
    "id": "/m/0524b41", 
    "name": [], 
    "sort":"/tv/tv_program/regular_cast./tv/regular_tv_appearance/actor./people/person/date_of_birth", 
    "/tv/tv_program/regular_cast": [{ 
    "/tv/regular_tv_appearance/actor": [{ 
     "name":   [], 
     "/people/person/date_of_birth": [] 
    }] 
    }] 
}] 

回答

0

但你不能要求进行排序/people/person/date_of_birth,你问排序上长嵌套表达式,经过多个中间节点,其中一些可能出现多次(如[]数组表示法所示)。 MQL抱怨这是多重性的。

要修复它,请将您的查询粘贴到查询编辑器中,单击最里面的/person/date_of_birth,然后单击“反转查询”。这会变成内而外的查询,并给你的东西,看起来像这样:

[{ 
    "name": [], 
    "/people/person/date_of_birth": [], 
    "type": "/tv/tv_actor", 
    "!/tv/regular_tv_appearance/actor": [{ 
    "!/tv/tv_program/regular_cast": [{ 
     "id": "/m/0524b41", 
     "name": [], 
     "sort": "/tv/tv_program/regular_cast./tv/regular_tv_appearance/actor./people/person/date_of_birth" 
    }] 
    }] 
}] 

这不正是你想要的,而是指你的目标查询的大致形状。

摆脱阵列括号内为单值性和移动排序子句外面的给我们:

[{ 
    "name": null, 
    "/people/person/date_of_birth": null, 
    "sort": "/people/person/date_of_birth", 
    "type": "/tv/tv_actor", 
    "!/tv/regular_tv_appearance/actor": [{ 
    "!/tv/tv_program/regular_cast": [{ 
     "id": "/m/0524b41", 
     "name": null 
    }] 
    }] 
}] 

这是功能性,并返回了81的出生日期排序权力者常规赛,但仍然可以清理一点。 !inverse属性表示法并不是必需的,因为我们有前向等价物,我们并不需要一次又一次地获得权力游戏的信息,因为它是常量,我们真的只是想用它作为过滤器。

将这些最后的调整给了我们一个最终的查询这样的返回很好的紧致的效果:

[{ 
    "name": null, 
    "/people/person/date_of_birth": null, 
    "sort": "/people/person/date_of_birth", 
    "type": "/tv/tv_actor", 
    "starring_roles": [{ 
    "series": { 
     "id": "/m/0524b41" 
    }, 
    "limit": 0 
    }] 
}] 

"limit": 0子句是一个小动作导致MQL使用子查询过滤,但不会打扰返回任何(恒定)信息的结果。 /tv/tv_actor/starring_roles/tv/regular_tv_appearance/series可以缩写为简单属性名称,因为它们的类型是由其上下文隐含的。

由于只有81个结果,MQL的默认限制为100,因此我们不需要担心增加或使用游标。

最早的权力游戏演员:Peter Vaughn,1923年出生。 最年轻:Lino Facioli b。 2000

请注意,7名演员在Freebase没有出生日期,所以我们不知道他们在年龄方面的排名。这是一个奖金查询,它返回他们的名字和ID以及他们的角色的名字。如果我们正在运行一个生产系统,我们可能会使用类似的东西来提供一个人员管理队列来弥补差距。

[{ 
    "name": null, 
    "/people/person/date_of_birth": { 
    "value": null, 
    "optional": "forbidden" 
    }, 
    "type": "/tv/tv_actor", 
    "starring_roles": [{ 
    "series": { 
     "id": "/m/0524b41" 
    }, 
    "character":null 
    }] 
}] 

七个字符/演员对是(是):卢斯波顿 - 迈克尔·麦令哈顿, 格雷戈尔Clegane - 柯南·史蒂文斯, Hizdahr ZO Loraq乔尔 - 弗莱, Rickon斯塔克 - 艺术帕金森, 亚诺什Slynt - Dominic Carter, Hodor - Kristian Nairn, Tommen Baratheon - Callum Wharry。我说“是”,因为我无法抵制Hodor的出生日期。奇怪的是它在维基百科,所以应该由Freebase自动提取。我认为有一个潜伏在那里的bug。