2016-04-14 3 views
3

Ich habe ein Konstrukt Abfrage in SPARQL was nützlich ist, Details über Verträge abzurufen:Wie kann ich ein RDF-Diagramm über einige Individuen mit einem einzigen CONSTRUCT erstellen?

CONSTRUCT { 
?contract dcterm:identifier ?id . 
?contract rdfs:label ?label . 

?contract pc:bidder ?bidder . 
} 
WHERE { 
    OPTIONAL { 
     ?contract dcterm:identifier ?id . 
    } 
    OPTIONAL { 
     ?contract rdfs:label ?label . 
    } 

    OPTIONAL { 
     ?contract pc:tender ?tender . 
     ?tender pc:bidder ?bidder . 
    } 
} 

Ich habe eine Liste der Verträge, die zum Beispiel PC: c1, pc: c2, und ich würde in einem abzurufen mögen einzelne Abfrage (oder ein einzelner HTTP-Aufruf) die Details von beiden.

Die erste Idee ist, den Vertrag Variable mit jeder uri und Vermeidung von Konflikten zwischen anderen Variablen zu ersetzen:

CONSTRUCT { 
    pc:c1 dcterm:identifier ?id1 . 
    pc:c1 rdfs:label ?label1 . 

    pc:c1 pc:bidder ?bidder1 . 


    pc:c2 dcterm:identifier ?id2 . 
    pc:c2 rdfs:label ?label2 . 

    pc:c2 pc:bidder ?bidder2 . 
} 
WHERE { 
    OPTIONAL { 
     pc:c1 dcterm:identifier ?id1 . 
    } 
    OPTIONAL { 
     pc:c1 rdfs:label ?label1 . 
    } 

    OPTIONAL { 
     ?pc:c1 pc:tender ?tender1 . 
     ?tender1 pc:bidder ?bidder1 . 
    } 
    OPTIONAL { 
     pc:c2 dcterm:identifier ?id2 . 
    } 
    OPTIONAL { 
     pc:c2 rdfs:label ?label2 . 
    } 

    OPTIONAL { 
     ?pc:c2 pc:tender ?tender2 . 
     ?tender2 pc:bidder ?bidder2 . 
    } 
} 

Das Problem ist, dass bei vielen uris der Abfrage ziemlich groß werden könnte.

Gibt es eine kompaktere Art, es zu schreiben?

Ich versuchte mit dem Operator IN (https://www.w3.org/TR/2013/REC-sparql11-query-20130321/#OperatorMapping - 17.4.1.9), aber Virtuoso scheint die Abfrage nicht zu analysieren. Das VALUES-Schlüsselwort (https://www.w3.org/TR/2013/REC-sparql11-query-20130321/#inline-data) schien eine gute Lösung zu sein, aber Jena scheint es nicht richtig zu analysieren.

+1

Welche Jena Version funktioniert nicht? – AKSW

Antwort

4

Verwenden Sie einfach Werte, um die Werte von ? Vertrag, die Sie wollen. (Jena unterstützt den Wert, so vielleicht gibt es einen Tippfehler in Ihrem Test war?) Hier ist, wie es aussehen würde:

CONSTRUCT { 
    ?contract dcterm:identifier ?id . 
    ?contract rdfs:label ?label . 
    ?contract pc:bidder ?bidder . 
} 
WHERE { 
    VALUES ?contract { pc:c1 pc:c2 }   #-- this is the new line 
    OPTIONAL { 
     ?contract dcterm:identifier ?id . 
    } 
    OPTIONAL { 
     ?contract rdfs:label ?label . 
    } 

    OPTIONAL { 
     ?contract pc:tender ?tender . 
     ?tender pc:bidder ?bidder . 
    } 
} 

Für die einzelne Eigenschaft Streichhölzer, können Sie auch diese kürzer machen mit Werten für die Eigenschaften. Sie können auch einen Eigenschaftsweg verwenden, um den Bieterteil kürzer zu machen:

+0

Sie richtig, der Fehler war ein Trennzeichen zwischen URLs in VALUES! Sehr sauber auch deinen zweiten Hinweis! Vielen Dank –

Verwandte Themen