Синтаксические правила Freebase MQL для извлечения языка каждого "/type/object/name"?
Я абсолютный новичок в MQL, пытающийся получить доступ к Freebase с помощью ken-rb следующим образом:
[1] pry(main)> res = Ken.get("/en/allium_neapolitanum")
=> #<Resource id="/en/allium_neapolitanum" name="Allium neapolitanum">
Я заметил запрос, отправленный через API freebase:
{"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"}
Поиграв с этим 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'") связан с каждым общим именем.
Есть ли возможность, используя Кена или изменив 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"
}
]
}]
1 ответ
Согласно документации, Ken поддерживает Ken.mqlread() в дополнение к Ken.get(), так что вы можете использовать это с разработанным вами MQL-запросом.
Сказав это, я бы сказал, что а) это ошибка в том, что они запрашивают несколько языков без возврата информации о языке, и б) вы, возможно, не захотите использовать Кена в любом случае, так как он все еще использует старый API freebase.com, который устарел и собирается быть выключенным. Новые API googleapis.com/freebase описаны здесь. Синтаксис MQL неизменен, но вам потребуется ключ API и необходимо использовать новую конечную точку.
Если вы хотите, чтобы Кен возвращал язык с текстовым значением, вы можете изменить часть запроса 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":[{}]
который даст вам имя на всех языках (вся эта информация также доступна в разделе / отражение / any_value) запроса.
Наконец, я вынужден указать, что запрос всех значений всех свойств будет дороже и медленнее, чем необходимо почти во всех случаях, поскольку обычно интересуются только несколько ключевых битов информации. Он найден для браузера / проводника / отладчика общего назначения, но это огромный перебор практически для всего остального.