我正在寻找一种简单的方法,在用户从Freebase建议中选择一所大学后,从维基百科信息框中获取有关大学的数据(名称、本地名称、城市等)。然而,从freebase返回的数据集非常小,不幸的是不包括维基百科链接。
目前,我正在使用"name"属性,并向http://live.dbpedia.org/data/"+name+".json
发出ajax请求。这通常是有效的,但在进行一些测试时,发现名称并不总是直接映射到正确的页面。让我把我的问题分成几个部分,让我自己说清楚:
-
是否可以配置Freebase建议插件,以便回复中包含维基百科链接?
-
或者,是否有类似的插件可以直接查询DBpedia,如下所示像Freebase一样简单且用户友好?
-
或者,作为B计划,有没有办法向"live.dbbedia.org",这样它只会在重定向?在维基百科API上,我可以发送一个"重定向"变量来实现这一点。但之后我必须自己解析数据…
计划B的问题是,没有什么能保证freebase对象的名称会让我找到正确的维基百科页面。即使在重定向之后…
我发誓我已经阅读了很多API文档,但一切都非常令人困惑,我选择不阅读关于RDF、SPARQL和MQL的长教程,因为我真的不认为解决方案应该如此复杂。我问这里是因为我真的希望我错过了一个简单的解决方案…
更新
{
id: "/en/babes-bolyai_university",
lang: "en",
mid: "/m/08c4bf",
name: "Babeş-Bolyai University",
notable: {
id: "/education/university",
name: "College/University"
},
score: 37.733559
}
这是我在建议小部件中选择"Babeş-Bolyai大学"后得到的结果。
解决方案
我认为我无法配置Suggest小部件来返回更多数据,所以在获得对象的Freebase ID后,我只发送了另一个请求,这次是一个专门询问维基百科ID的查询。我不知道任何MQL,也找不到带有维基百科ID的Freebase字段的名称。也许我很愚蠢,但Freebase文档真的让我困惑。无论如何,Tom Morris的回答和这个问题帮助我构建了返回我想要的查询:
https://www.googleapis.com/freebase/v1/mqlread?query={"id":"/en/babes-bolyai_university","key":{"namespace":"/wikipedia/en_title","value":null}}
结果中的字符串带有特殊unicode字符的数字代码(在我的例子中是Babe$0219-Bolyai_University
)。我已经能够用String.fromCharCode(parseInt(219, 16))
转换代码,但如果有人知道转换整个字符串的方法,那将很有帮助。否则,我可以制作自己的函数,用相应的字符替换"$dddd"模式。
谢谢你的帮助!
据我所知,没有一个DBpedia自动建议可以与Freebase Suggest相媲美。
通过在output
参数中使用MQL表达式,可以使用Suggest检索Freebase中的任何内容。对于简单的东西,例如名称、别名,MQL基本上只是一个包含相关属性名称的JSON片段。
编辑:output
参数实际上似乎没有在Suggest的上下文中记录,但任何不是Suggest参数的内容都会透明地传递给Freebase Search API,因此您可以使用这里描述的所有内容:https://developers.google.com/freebase/v1/search-output您可以根据每个建议返回的要求获得尽可能多或尽可能少的信息。
如果你确实需要查询DBpedia,你应该使用Wikipedia/DBpedia键,它不一定与名称相同。对于英语维基百科,密钥在名称空间/wikipedia/en
中,或者如果您希望数字维基百科ID在名称空间"/Wikipedia/en_ID"中。如果要查询其他语言的Wikipedia,请将"en"替换为适当的语言代码。这些键转义了一些非ASCII字符,因此如果需要取消转义它们,可以使用此处的文档:http://wiki.freebase.com/wiki/MQL_key_escaping
您可以更新"flimp_service_path"参数。这里有一个描述在freebase建议文档(https://developers.google.com/freebase/v1/suggest)。我使用的此配置来获取实体的所有密钥。
$(inputClass).suggest(
{
"key" : _FREEBASE_API_KEY_BROWSER_APP,
"flyout_service_path":"/search?filter=(all mid:${id})&output=(notable:/client/summary description type /type/object/key)&key=${key}"
}
).bind("fb-select", this.fbSelectedHandler);
在freebase响应中,我现在可以在"output"参数中看到"/type/object/key"和实体的所有键(维基百科等)
我现在的问题是如何从输出中获取这些数据?。在"fb-select"事件的"data"变量中,不要携带此字段。
请帮忙。。