我是MQL的绝对初学者,试图以Freebase方式访问ken-rb:
[1] pry(main)> res = Ken.get("/en/allium_neapolitanum")
=> #<Resource id="/en/allium_neapolitanum" name="Allium neapolitanum">
我注意到通过freebase API提交的查询:
{"guid":null,"name":null,"ken:type":[
{"id":null,"name":null,"properties":[
{"id":null,
"name":null,
"expected_type":null,
"unique":null,
"reverse_property":null,
"master_property":null}]}],
"/type/reflect/any_master":[
{"id":null,
"link":null,
"name":null,
"optional":true,
"limit":999999}],
"/type/reflect/any_reverse":[
{"id":null,
"link":null,
"name":null,
"optional":true,
"limit":999999}],
"/type/reflect/any_value":[
{"link":null,
"value":null,
"optional":true,
"limit":999999}],
"id":"/en/allium_neapolitanum"}
在query editor中摆弄这个MQL我找到了一种方法来获取我的资源的常用名称列表:
[2]pry(#<Ken::Resource>):2> data["/type/reflect/any_value"].map { |h| h }
=> [{"link"=>"/type/object/name", "value"=>"Allium neapolitanum"},
{"link"=>"/type/object/name", "value"=>"שום משולש"},
{"link"=>"/type/object/name", "value"=>"Ail blanc"},
{"link"=>"/biology/organism_classification/scientific_name",
"value"=>"Allium neapolitanum"},
{"link"=>"/type/object/name", "value"=>"Neapolitanischer Lauch"}]
[3] pry(#<Ken::Resource>):2> names = data["/type/reflect/any_value"].select { |h| h["link"]=="/type/object/name"}
=> [{"link"=>"/type/object/name", "value"=>"Allium neapolitanum"},
{"link"=>"/type/object/name", "value"=>"שום משולש"},
{"link"=>"/type/object/name", "value"=>"Ail blanc"},
{"link"=>"/type/object/name", "value"=>"Neapolitanischer Lauch"}]
[4] pry(#<Ken::Resource>):2> names.map { |name| name["value"] }
=> ["Allium neapolitanum", "שום משולש", "Ail blanc", "Neapolitanischer Lauch"]
问题是:我需要知道哪种语言(我的意思是一个属性,如:“lang:'/ lang / fr'”)与每个常用名称相关。
有可能使用Ken或更改MQL查询/提交其他查询等,还有每个“/ type / object / name”的语言是什么?
的 [编辑] 的
我找到了解决方案的可能方法,但是,我的目标是让数据直接修改由ken-rb发起的原始查询(..复制到问题的顶部)
MQL可能是:
[{
"name": [{
"lang": null,
"value": null
}]
"id": "/en/allium_neapolitanum"
}]
给出这个结果
"result": [{
"id": "/en/allium_neapolitanum",
"name": [
{
"lang": "/lang/en",
"value": "Allium neapolitanum"
},
{
"lang": "/lang/he",
"value": "שום משולש"
},
{
"lang": "/lang/fr",
"value": "Ail blanc"
},
{
"lang": "/lang/de",
"value": "Neapolitanischer Lauch"
}
]
}]
答案 0 :(得分:1)
根据文档,除了Ken.get()之外,Ken还支持Ken.mqlread(),因此您可以将其用于您制定的MQL查询。
话虽如此,我认为a)这是一个错误,他们在不返回语言信息的情况下查询多种语言而b)你可能不想使用Ken,因为它似乎仍在使用旧的freebase.com API已弃用且即将关闭。新的googleapis.com/freebase API已记录在案here。 MQL语法未更改,但您需要API密钥并需要使用新端点。
如果要修复Ken以返回带有文本值的语言,可以将查询的any_value部分修改为如下所示:
{
"/type/reflect/any_value": [{
"*": null,
"link": {
"master_property": null,
"target": {
"id": null,
"optional": true
}
},
"limit": 99999
}],
"id": "/en/allium_neapolitanum"
}
我认为你也应该能够使用
{
"/type/reflect/any_value": [{}],
"id": "/en/allium_neapolitanum"
}
但是它为您提供了语言和值,但没有链接,因此您无法分辨与该值相关联的属性(不是非常有用)。
请注意,您可以从查询中删除顶级name
属性,因为它在技术上是多余的。如果您想保留它以便更简单地访问该名称,您可以考虑将其从"name":null
更改为"name":[{}]
,这将为您提供所有语言的名称(所有这些信息也可在/ reflect中找到/ any_value)查询的一部分。
最后,我觉得有必要指出,在几乎所有情况下查询所有属性的所有值都会更加昂贵且速度慢,因为人们通常只对几个关键信息感兴趣。它适用于通用浏览器/资源管理器/调试器,但几乎所有其他东西都具有极大的功能。