2016-10-21 1 views
1

Ich versuche herauszufinden, wie Jena TDB SPARQL-Abfragen mit mehreren FROM Klauseln auf dem physischen Abfrageplan-Ebene behandelt. Ich würde gerne wissen, wie Jena TDB die Ausführung einer Abfrage über verschiedene Graphen behandelt.Jena TDB physischen Abfrageplan mit mehreren FROM-Klauseln

Ich habe ein paar kleine Experimente gemacht und die Abfragealgebra betrachtet, es ist mir jedoch nicht klar, wie die FROM Klauseln die Algebra beeinflussen. Es sieht so aus, als ob die FROM-Klauseln in der Algebra verworfen werden. Ich erwarte, dass die Algebra über die Vereinigung der Graphen ausgewertet wird, aber ich möchte sicher sein.

Ich habe folgende Quads:

<http://example.com/book2/> <http://example.com/price> "5"^^<http://www.w3.org/2001/XMLSchema#integer> <http://example.com/A> . 
<http://example.com/book2/> <http://example.com/title> "Lord of the Rings" <http://example.com/B> . 

und die folgende Abfrage:

SELECT (AVG(?price) as ?total) 
FROM <http://example.com/A> 
FROM <http://example.com/B> 
WHERE { 
    ?book <http://example.com/price> ?price . 
    ?book <http://example.com/title> ?title . 
} 

./tdbquery --loc test --query test.sparql --explain 

Die Abfrage Algebra sieht wie folgt aus:

INFO exec     :: ALGEBRA 
    (project (?total) 
    (extend ((?total ?.0)) 
     (group() ((?.0 (avg ?price))) 
     (bgp (triple ?book <http://example.com/price> ?price))))) 

Wenn ich ausführen die Abfrage über die Daten Ich erhalte das erwartete Ergebnis.

Antwort

0

FROM (und FROM NAMED) sind nicht wirklich Teil der Abfrage, sondern Hinweise darauf, was der Datensatz abgefragt werden soll. Diese Klauseln ändern nicht, was die Abfrage tut, sondern nur, worauf sie angewendet wird, so dass Sie sie nicht in der Algebra sehen.

Was für ein bestimmten Prozessor macht mit dieser Information variiert:

  • einige Prozessoren die angeforderte Datenmenge (auch das Herunterladen von Daten)
  • bauen, aber es ist auch üblich, einen Datensatz explizit in APIs zur Verfügung zu stellen (zB query(query_string, dataset)) In diesem Fall wird der Prozessor sie ignorieren, da ein Datensatz bereitgestellt wurde.
  • ein Dataset möglicherweise auch in einem SPARQL protocol request geliefert werden, in diesem Fall, wie bei dem API-Aufruf, wird der Prozessor die NAMED Klausel ignorieren.

Jetzt eine TDB Datenbank ist ein Datensatz, aber TDB hat eine Besonderheit 'dynamic datasets' die FROM und FROM NAMED verwendet so genannte Sub-Datensatzes in Kraft zu bilden, die in den FROM Klauseln genannten Graphen abgefragt denen begrenzen.

+0

In dem oben dargestellten Fall müssen die Datensätze irgendwann zusammengeführt werden, damit die Abfrage beantwortet werden kann. Die Abfrage wird keine Antwort liefern, wenn sie über Graph A und dann Graph B ausgeführt wird. Ich würde gerne wissen, wie das konkret funktioniert. –

+1

Aha! TDB hat eine spezielle Eigenschaft: [dynamische Datensätze] (https://jena.apache.org/documentation/tdb/dynamic_datasets.html), weshalb Ihre Abfrage funktioniert. – user205512

+0

Ich weiß, wissen Sie, wann das dynamische Dataset erstellt wurde? Ist es einmal getan, bevor die Abfrage beantwortet wird oder für jedes "Blatt" im Abfrageplan? Mein Beispiel oben ist, um dieses Problem einfach zu zeigen, wenn meine Bedeutung nicht klar ist, dann werde ich eine neue Frage posten, um das Problem mit einem Beispiel zu erklären. –

Verwandte Themen