2011-12-20 21 views
9

Sono un principiante di SPARQL e mi chiedevo se esistesse una query che potrebbe aiutarmi a restituire le relazioni transitive. Per esempio il file n3 qui sotto vorrei una query che restituirebbe "a is the sameas c" o qualcosa del genere. GrazieSPARQL Querying Transitive

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

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

risposta

13

È possibile utilizzare i percorsi di proprietà se si utilizza un motore di SPARQL 1.1 opportunamente abilitato, hai taggato la tua domanda Jena quindi immagino che si sta utilizzando il suo motore di ARQ che supporta questa funzionalità.

Così si può scrivere una query come la seguente:

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

Annotare il + dopo il predicato, utilizzato per indicare che dovrebbe apparire per i rapporti costituiti da uno/più fasi.

La sintassi per i percorsi di proprietà può essere trovata here ed è un'espressione molto regolare come. L'unico lato negativo delle query che utilizzano questo è che non si ottiene alcuna informazione su quanto sono lunghi i percorsi o quali sono i nodi intermedi.

+0

Grazie ancora per l'aiuto. Controllando definitivamente il collegamento sulla sintassi SPARQL – Sam

+3

Se la cosa che stai interrogando supporta il ragionamento OWL, in particolare un profilo di OWL che include la transitività e hai definito la proprietà come TransitiveProperty, allora non hai bisogno di alcun SPARQL speciale sintassi, puoi semplicemente usare normalmente la proprietà e il ragionatore farà la cosa giusta. – Michael

4

Mentre RobV's answer è corretto nel tuo caso, penso che la natura bidirezionale del gufo: lo stesso vale la pena menzionare.

Facciamo estendere il vostro esempio da questo:

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

In questo caso un semplice owl:sameAs+ non sarebbe sufficiente per trovare :e, quindi forse usare qualcosa come (owl:sameAs|^owl:sameAs)+ di trovare tutto l'albero di equivalenza. Tieni presente che, a seconda dell'endpoint, ciò potrebbe causare loop.

Inoltre ci potrebbe essere estensioni specifiche di attuazione per gestire owl:sameAs ragionamento, come in Virtuoso:

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

ritorno anche ?p e ?o che vengono emessi per :b, :c, :d e :e.