2011-12-20 15 views
9

Jestem początkującym użytkownikiem języka SPARQL i zastanawiałem się, czy istnieje zapytanie, które może pomóc mi w powrocie do przechodniów. Na przykład plik n3 poniżej chciałbym zapytanie, które zwróci "a jest tym samym c" lub coś wzdłuż tych linii. DziękiPrzetwarzanie zapytań SPARQL

@prefix : <http://websitename.com/links/> . 
@prefix owl: <http://www.w3.org/2002/07/owl#> . 

:a owl:sameas :b. 
:b owl:sameas :c. 

Odpowiedz

13

Można użyć ścieżki własności jeśli używasz odpowiednio aktywowany SPARQL 1.1 silnik otagowaniu pytanie Jena więc zakładam używasz jego silnik ARQ, który obsługuje tę funkcję.

Więc można napisać kwerendę tak:

PREFIX owl: <http://www.w3.org/2002/07/owl#> 
SELECT * 
WHERE 
{ 
    ?x owl:sameAs+ ?y 
} 

Zanotować + po orzecznika, używany do wskazania, że ​​powinien szukać relacji składających się z jednej/więcej krokach.

Składnię ścieżek właściwości można znaleźć here i jest to wyrażenie bardzo regularne. Jedyną wadą tych zapytań jest to, że nie otrzymujesz żadnych informacji o tym, jak długie są te ścieżki ani jakie są węzły pośrednie.

+0

Jeszcze raz dziękuję za pomoc. Konieczne jest sprawdzenie linku na składnię SPARQL – Sam

+3

Jeśli zapytanie, które obsługuje zapytania OWL, w szczególności profil OWL, który zawiera przechodniość i zdefiniowałeś właściwość TransitiveProperty, nie potrzebujesz żadnego specjalnego SPARQL-a składnia, możesz po prostu użyć właściwości normalnie, a programista zrobi to, co trzeba. – Michael

4

Podczas gdy RobV's answer jest poprawny w twoim przypadku, myślę, że warto wspomnieć o dwukierunkowej naturze owl: sameAs.

Powiedzmy przedłużyć swój przykład przez to:

:a owl:sameAs :d. 
:e owl:sameAs :d. 

W tym przypadku prosty owl:sameAs+ nie wystarczy, aby znaleźć :e, więc może użyć czegoś jak (owl:sameAs|^owl:sameAs)+ znaleźć całe drzewo równoważności. Należy pamiętać, że w zależności od punktu końcowego może to powodować pętle.

Również nie może być realizacja konkretnych rozszerzeń do obsługi owl:sameAs rozumowanie, jak w Virtuoso:

DEFINE input:same-as "yes" 
select * where { :a ?p ?o. } 

powrocie również ?p i ?o które zostały wydane na :b, :c, :d i :e.