2014-03-05 9 views
5

Ist es möglich, beliebige Länge der Pfadabfragen in SPARQL zu tun. Sagen wir, ich habe neo4j Speicher, der ein Diagramm hat, das nur PARENT_OF Beziehungen darstellt (z. B. einen Stammbaum betrachten). Eine Chiffre Abfrage alle Vorfahren einer Person zu bekommen wieBeliebige Pfadlängenabfrage in SPARQL

start n (some node from index query) match n<-[:PARENT_OF*]-k return k 

aussehen würde wie diese Abfrage wie in SPARQL aussehen würde, wenn diese neo Laden waren als RDF basierte Triple-Store vertreten sein. Ist das überhaupt möglich?

Antwort

9

Wenn Sie Daten wie dieses:

@prefix : <http://stackoverflow.com/q/22210295/1281433/> . 

:a :parentOf :b . 
:b :parentOf :c . 
:c :parentOf :d . 

dann können Sie eine Abfrage wie folgt verwenden, SPARQL 1.1 ist mit property paths:

prefix : <http://stackoverflow.com/q/22210295/1281433/> 

select ?ancestor ?descendent where { 
    ?ancestor :parentOf+ ?descendent 
} 

auf Ergebnisse wie diese:

------------------------- 
| ancestor | descendent | 
========================= 
| :a  | :b   | 
| :a  | :c   | 
| :a  | :d   | 
| :b  | :c   | 
| :b  | :d   | 
| :c  | :d   | 
------------------------- 

Beachten Sie, dass mit * erlaubt null Vorkommen der Relation und bezieht jeden Knoten auf sich selbst. Wenn Sie wollen, dass jedes Ding ein Vorfahre von sich selbst ist, dann könnten Sie + durch * in meiner Abfrage ersetzen.

+1

Danke für die Beantwortung. Was sind die Berechnungskosten dieser Operation? Ich denke, es wird von der Implementierung des Triple-Shops abhängen. Für gängige Implementierungen wie allegro graph db ist die Performance vergleichbar mit neo4j oder titan. – Amit

+1

SPARQL definiert kein bestimmtes Ausführungsmodell, daher ist es nicht wirklich einfach zu sagen, wie rechenintensiv es ist. Es hängt wirklich von der Implementierung ab. Wenn Sie an einer Performance für bestimmte Implementierungen interessiert sind, müssen Sie sie wahrscheinlich selbst testen oder prüfen, ob jemand sie verglichen und die Ergebnisse veröffentlicht hat. –