2016-05-02 1 views
1

У меня есть некоторый успех от a previous question, но получение результатов для других языков DBpedia не удается для некоторых (но не для всех) записей.SPARQL не возвращает сову: sameAs свойства, которые существуют в DBpedia

Например,

SELECT * WHERE { 
    VALUES ?label {"Acid Rain"@en "Chocolate"@en} 
    ?en rdfs:label ?label . 
    optional { ?en owl:sameAs ?es . FILTER regex(str(?es), "es.dbpedia") } 
    filter not exists {?en a skos:Concept} 
} 

возвращает

{ "head": { "link": [], "vars": ["label", "en", "es"] }, 
    "results": { "distinct": false, "ordered": true, "bindings": [ 
    { "label": { "type": "literal", "xml:lang": "en", "value": "Chocolate" } , "en": { "type": "uri", "value": "http://dbpedia.org/resource/Chocolate" } , "es": { "type": "uri", "value": "http://es.dbpedia.org/resource/Chocolate" }}, 
    { "label": { "type": "literal", "xml:lang": "en", "value": "Acid Rain" } , "en": { "type": "uri", "value": "http://dbpedia.org/resource/Acid_Rain" }} ] } } 

Обратите внимание на отсутствие испанских результатов "Acid Rain". Тем не менее, owl:sameAs раздел http://dbpedia.org/page/Acid_rain явно имеет результаты для испанского языка, и начинается с http://es.dbpedia.

Почему конечная точка DBpedia SPARQL не возвращает результаты owl:sameAs, когда они четко указаны в DBpedia?

+0

У меня есть ограниченный успех, используя '(owl: sameAs |^owl: sameAs) +'. Это определенно подтягивает испанский эквивалент для Acid_Rain. Однако, если я попытаюсь захватить сразу несколько языков - например, 'optional {? En (owl: sameAs |^owl: sameAs) +? Es. FILTER regex (str (? Es), "es.dbpedia")} необязательный {? En (owl: sameAs |^owl: sameAs) +? Pt. FILTER regex (str (? Pt), "pt.dbpedia")} '- Я получаю эту ошибку:' Virtuoso 37000 Error SP031: компилятор SPARQL: Variable '_ :: trans_subj_6_2' используется в подвыражениях запроса, но не присваивается ' – Justin

+1

Тогда это ошибка в Virtuoso. Вы можете/должны открыть билет в своем репозитории Github или опубликовать его в своем списке рассылки, чтобы его можно было исправить. – AKSW

+0

@AKSW, вы имеете в виду '(owl: sameAs |^owl: sameAs) +' предикат является ошибкой или отсутствием результатов для 'dbr: Acid_Rain' с использованием простой' owl: sameAs' является ошибкой? – Justin

ответ

2

Я думаю, что несколько дополнительных компонентов должны были сработать. Возможно, проблема в Virtuoso, предложенная @ASKW в комментариях?

Вы должны быть в состоянии получить различные языки в одном регулярном выражении заявления, например:

FILTER regex(str(?es), "(es|pt).dbpedia") } 

Только в случае, если вы ищете испанские и другие языковые версии лейбл, есть более простой способ сделай это. Если это так попробуйте следующее:

SELECT * 
WHERE { 
    VALUES ?label {"Acid Rain"@en "Chocolate"@en} 
    ?en rdfs:label ?label . 
    ?en rdfs:label ?allLabels . 
    FILTER (lang(?allLabels) = "es") 
} 

Имейте в виду, что OPTIONAL может быть дорогим, потому что эффективно увеличивает пространство поиска. Поэтому избегайте, если это необходимо, и в вашем случае необязательно не требуется.

Другим решением, BTW, является фильтрация с использованием CONTAINS().

+0

Это аккуратный трюк с лейблами! Тем не менее, мне просто нужны URI DBpedia. У нас есть некоторые международные пользователи, и я кодирую утилиту, которая будет вытаскивать правильную ссылку DBpedia, чтобы автоматически отображаться на них. – Justin

+0

Можете ли вы объяснить, почему выполнение регулярного выражения будет работать, когда отдельные фильтры не будут? Я хотел бы понять, как это работает, особенно если я собираюсь написать код, чтобы иметь дело с де-нормализацией данных. – Justin

+0

Я думаю, что множественные опции должны были сработать. Возможно, проблема в Virtuoso? Опционы могут быть дорогими, потому что они эффективно увеличивают пространство поиска, поэтому избегайте их, если это необходимо, и в вашем случае необязательно не требуется. Другим решением, BTW является фильтрация с использованием 'CONTAINS()'. – scotthenninger

 Смежные вопросы

  • Нет связанных вопросов^_^