2016-06-12 10 views
0

Ich habe folgende SPARQL-Abfrage, die eine Unterauswahl enthält. Die Daten enthalten mehrere Grafiken und ich möchte wissen, welche Diagramm die Werte für ?b und ?m kommen aus:SPARQL Subquery Graph Namen

select ?b, ?m, ?g1 
where { 

{ 
    select ?o1, ?o2, ?e 
    where{ 
     graph ?g{ 
     ?s <http://ndssl.bi.vt.edu/chicago/vocab/dendrogram_infector_pid> ?o1. 
     ?s <http://ndssl.bi.vt.edu/chicago/vocab/dendrogram_infectee_pid> ?o2. 
     ?s <http://ndssl.bi.vt.edu/chicago/vocab/dendrogram_iteration> '0'^^xsd:decimal. 
     ?s <http://ndssl.bi.vt.edu/chicago/vocab/dendrogram_exposureday> ?e. 
     ?s1 <http://ndssl.bi.vt.edu/chicago/vocab/contactnetwork_pid1> ?o1. 
     ?s1 <http://ndssl.bi.vt.edu/chicago/vocab/contactnetwork_pid2> ?o2. 
     ?s1 <http://ndssl.bi.vt.edu/chicago/vocab/contactnetwork_acttype1> '5'^^xsd:decimal. 
     ?s1 <http://ndssl.bi.vt.edu/chicago/vocab/contactnetwork_acttype2> '5'^^xsd:decimal 
    } 
    }ORDER BY ASC(?e) LIMIT 1 
} 

{ 

graph ?g1 { 
?b <http://ndssl.bi.vt.edu/chicago/vocab/getInfectedBy> ?o1. 
?m <http://ndssl.bi.vt.edu/chicago/vocab/getInfectedBy>* ?b. 
    } 

} 

} 

Das zweite Diagramm Muster eine transitive Eigenschaft Pfad enthält und die Abfrage liefert folgende korrekte Ergebnis:

b              m              g1 
----------------------------------------------------- ----------------------------------------------------- ------------------------------------------------------- 
<http://ndssl.bi.vt.edu/chicago/person/pid#446734805> <http://ndssl.bi.vt.edu/chicago/person/pid#446753456> <http://ndssl.bi.vt.edu/chicago/dendrogram/replicate1/> 

Allerdings möchte ich die Zwischenknoten sehen und die Pfadlänge von transitiven Beziehung zählen. Wenn ich graph ?g1 aus der Abfrage entfernen, dann zeigt es die Zwischenknoteninformationen wie folgt vor:

b              m 
--------------------------------------------------- --------------------------------------------------- 
http://ndssl.bi.vt.edu/chicago/person/pid#446718746 http://ndssl.bi.vt.edu/chicago/person/pid#446718746 
http://ndssl.bi.vt.edu/chicago/person/pid#446734805 http://ndssl.bi.vt.edu/chicago/person/pid#446734805 
http://ndssl.bi.vt.edu/chicago/person/pid#446734805 http://ndssl.bi.vt.edu/chicago/person/pid#446753456 

Der Zweck des Abfragediagrammnamen, um herauszufinden, für den Abgleich ?b und ?m ist. Daher möchte ich graph ?g1 verwenden. Ist es möglich, Zwischenknoten anzuzeigen, indem das Schlüsselwort beibehalten wird? Ich benutze Virtuoso.

+0

Off-Topic: Es ist illegal, SPARQL-Syntax mit dem ','. Aus Gründen der besseren Lesbarkeit würde ich vorschlagen, es kompakter zu gestalten, indem Sie die TURTLE-Funktionen verwenden, insbesondere für die erste Unterauswahl. – AKSW

Antwort

1

Da Sie nicht g die erste GRAPH Anweisung ist nicht erforderlich. Beachten Sie auch, dass die zweite GRAPH Anweisung nur ?o1 verwendet, also die folgende Abfrage, was Sie wollen. Vielleicht möchten Sie auch in Ihrer SELECT-Klausel SPARQL syntax überprüfen.

PREFIX ndssl: <http://ndssl.bi.vt.edu/chicago/vocab/> 
SELECT ?b ?m ?g1 
WHERE { 
    { 
    SELECT ?o1 
    WHERE { 
     ?s ndssl:dendrogram_infector_pid ?o1    . 
     ?s ndssl:dendrogram_infectee_pid ?o2    . 
     ?s ndssl:dendrogram_iteration  '0'^^xsd:decimal . 
     ?s ndssl:dendrogram_exposureday ?e    . 
     ?s1 ndssl:contactnetwork_pid1  ?o1    . 
     ?s1 ndssl:contactnetwork_pid2  ?o2    . 
     ?s1 ndssl:contactnetwork_acttype1 '5'^^xsd:decimal . 
     ?s1 ndssl:contactnetwork_acttype2 '5'^^xsd:decimal 
    } ORDER BY ASC(?e) LIMIT 1 
    } 
    GRAPH ?g1 { 
    ?b ndssl:getInfectedBy ?o1 . 
    ?m ndssl:getInfectedBy* ?b . 
    } 
} 

Im Endpunkt sofern für ?b oder ?m, unabhängig davon, ob eine GRAPH Anweisung verwendet wird oder nicht kein Spiel ist.

+0

Vielen Dank für Ihre Antwort. Ich muss den niedrigsten Wert des "? E" anwenden, deshalb habe ich "ORDER BY ASC (? E) LIMIT 1" in meiner Abfrage verwendet. Sie haben es jedoch aus Ihrer Antwort weggelassen. Wenn ich die "ORDER BY" -Klausel verwende, dann habe ich das gleiche Problem wie in meiner Frage erwähnt. Sie können meine Daten durch folgende SPARQL-Endpunkt testen: „http://taos.vbi.vt.edu:8890/sparql“ –

+0

OK, ich sehe, was die Unterauswahl geht, aber die Frage bleibt etwas vage. – scotthenninger

+0

Endpunkt bietet Übereinstimmung für? B und? M. Meine Frage ist, wenn ich "GRAPH" Schlüsselwort dann SPARQL Select-Anweisung nicht Zwischenknoten aus Transitivität verwenden. Wenn ich jedoch das Schlüsselwort "GRAPH" weglasse, funktioniert es einwandfrei. Das bedeutet, dass es Zwischenknoteninformationen bereitstellt. Wieso ist es so? Ich brauche Zwischenknoten Informationen mit "GRAPH" URI. –