Как сопоставить строковые метки из внешней конечной точки SPARQL с строковыми метками в моей локальной онтологии?
PREFIX ex: <http://www.semanticweb.org/caeleanb/ontologies/twittermap#>
PREFIX dbo: <http://dbpedia.org/ontology/>
SELECT ?name (STR(?name) AS ?strip_name) ?name2
WHERE {
?p ex:displayName ?name2 .
SERVICE <http://dbpedia.org/sparql> {
{ ?s rdfs:label ?name .
?s rdf:type foaf:Person . }
UNION
{ ?x rdfs:label ?name .
?x dbo:wikiPageRedirects ?s . }
}
FILTER(STR(?name) = ?name2) .
}
Это запрос SPARQL, который я отправляю на конечную точку SPARQL Stardog (размещается локально). Я знаю, что некоторые префиксы отсутствуют, но я обещаю, что это не проблема префиксов, Stardog содержит остальные префиксы.
В запросе предполагается найти все foaf:Person
s, которые разделяют строку метки с ресурсом отображаемого имени в моей собственной онтологии. Причиной создания UNION является попытка перехватить все страницы, которые также перенаправляют на Персона (но дайте мне знать, если эта часть выглядит испорченной).
В основном проблема в том, что приведенный выше запрос дает мне вывод, например:
name strip_name name2
John McCain (en) | John McCain | John McCain
John McCain (de) | John McCain | John McCain
John McCain (es) | John McCain | John McCain
...
Но Джон Маккейн - не местозаполнитель, он единственный, кто появляется, только на нескольких языках. Тем не менее, я ожидаю, что появится гораздо больше, так как я могу выполнять такие запросы:
PREFIX ex: <http://www.semanticweb.org/caeleanb/ontologies/twittermap#>
PREFIX dbo: <http://dbpedia.org/ontology/>
SELECT ?name (STR(?name) AS ?strip_name) ?name2
WHERE {
?p ex:displayName ?name2 .
SERVICE <http://dbpedia.org/sparql> {
{ ?s rdfs:label ?name .
?s rdf:type foaf:Person .
FILTER(?name="Bill Nye"@en)}
UNION
{ ?x rdfs:label ?name .
?x dbo:wikiPageRedirects ?s .
FILTER(?name="Bill Nye"@en)}
}
FILTER(STR(?name) = ?name2) .
}
и получить вывод как:
name strip_name name2
Bill Nye (en) | Bill Nye | Bill Nye
Я могу повторить этот трюк с другими именами, которые, как я знаю, должны совпадать в моей онтологии, такими как "Джейми Оливер" и "Дональд Трамп", но по какой-то причине единственное имя, которое отображается в общей версии запроса, - это Джон Маккейн. Кто-нибудь может мне это объяснить? Я уверен, что не понимаю какую-то часть блока SERVICE, но я пробовал много разных конфигураций и не могу заставить этот запрос работать должным образом. Спасибо за любую помощь.