2014-10-25 2 views
0

Я пытаюсь принести несколько записей через DBpedia используя следующую SPARQL:SPARQL не возвращает правильный ответ

SELECT DISTINCT ?thing, ?url, ?genre WHERE { 
     ?thing foaf:name    ?name ; 
      foaf:isPrimaryTopicOf ?url . 
     ?name bif:contains "'mega'" . 
     { 
     ?thing dbpedia-owl:genre ?genre ; 
       a     dbpedia-owl:Band 
     } 
     UNION 
     { 
     ?thing dbpedia-owl:genre ?genre ; 
       a     dbpedia-owl:MusicalArtist 
     } 
     UNION 
     { 
     ?thing a <http://umbel.org/umbel/rc/MusicalPerformer> 
     } 
    } 
    LIMIT 1000 

Он работает правильно в большинстве случаев, если я не пытаюсь искать «Джеймс Браун» вместо «мега «тогда я не получаю никаких результатов, однако, когда я просто ищу Джеймса, я получаю Джеймса коричневого цвета как один из результатов.

Задайте этот вопрос, используя DBpedia's SPARQL Query Editor.

Пожалуйста, помогите мне отлаживать, почему я не получаю правильные результаты, когда я ввожу «Джеймс коричневый» в качестве строки запроса.

+0

Вы входя «Джеймс коричневые» с строчной б или «Джеймс Браун "с капиталом B? –

ответ

1

Во-первых, обратите внимание, что http://dbpedia.org/resource/James_Brown имеет значение foaf: имя «Brown, James Joseph-Jr.», поэтому «James Brown» не будет соответствовать. Я бы написать запрос с использованием стандартной содержит функцию фильтра и задать для обоего имен в отдельности:

SELECT DISTINCT ?thing, ?url, ?genre WHERE { 
    values ?type { dbpedia-owl:Band dbpedia-owl:MusicalArtist <http://umbel.org/umbel/rc/MusicalPerformer> } 
    ?thing foaf:name ?name ; 
     foaf:isPrimaryTopicOf ?url ; 
     a ?type . 
    optional { ?thing dbpedia-owl:genre ?genre } 
    filter contains(str(?name), "James") 
    filter contains(str(?name), "Brown") 
} 
LIMIT 1000 

Это получает три результата, все ссылаясь на Джеймс Браун, крестный отец соула. Другой вариант был бы использовать RDFS: свойства ярлыка, который бы содержать Джеймс Браун (он содержит название статьи Википедии):

SELECT DISTINCT ?thing, ?url, ?genre WHERE { 
    values ?type { dbpedia-owl:Band dbpedia-owl:MusicalArtist <http://umbel.org/umbel/rc/MusicalPerformer> } 
    ?thing rdfs:label?name ; 
     foaf:isPrimaryTopicOf ?url ; 
     a ?type . 
    optional { ?thing dbpedia-owl:genre ?genre } 
    filter contains(str(?name), "James Brown") 
} 
LIMIT 1000 
+0

Ваш второй запрос работает достаточно хорошо, есть ли способ сделать регистр нечувствительным к регистру? спасибо за ваш ответ, кстати :) – whizcreed

+1

Чтобы сделать регистр без учета регистра, я бы сделал, например, 'filter contains (lcase (str (? name)), lcase (« James Brown »))'. То есть, я бы просто нормализовал строки в нижнем регистре (или в верхнем регистре, с 'ucase') и использовал' contains'. Вы также можете использовать 'regex' с флагом' i', но механизм регулярных выражений кажется излишним для выполнения ограничения строки. –

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