2013-07-11 5 views
12

In SPARQL können wirWählen Sie mehrere Werte als Objekt in SPARQL Muster

select * where { 
    ?s (_:prop1 | _:prop2) "some_val" . 
    ... 
    #use ?s in other patterns 
    ?s ?o ?p . 
} 

so etwas wie dies tun, ist es möglich, das gleiche gilt für das Objekt Teil des Musters zu tun? Und was sind einige Umgehungslösungen für den Fall, dass dies nicht möglich ist?

Zum Beispiel:

select * where { 
    ?s _:prop ("v1" | "v2") . 
    ... 
    #use ?s in other patterns 
    ?s ?o ?p . 
} 

Antwort

18

Es gibt ein paar Möglichkeiten, dies zu tun. Die einfachste und reinste SPARQL 1.0-Methode ist die Verwendung von UNION, z.

SELECT * WHERE 
{ 
    { ?s _:prop "v1" } UNION { ?s _:prop "v2" } 

    # Use ?s in other patterns 
} 

Dies ist wahrscheinlich die einfachste Methode, aber wenn Sie auf ?s mehrere Einschränkungen benötigen, können diese schnell unhandlich bekommen.

Die zweite Methode besteht darin, die IN-Funktion in einer FILTER-Klausel zu verwenden, dies erfordert eine SPARQL 1.1-Implementierung, z.

SELECT * WHERE 
{ 
    ?s _:prop ?value . 
    FILTER(?value IN ("v1", "v2")) 

    # Use ?s in other patterns 
} 

Problem hier ist, dass IN mit sehr schlecht durchführen können, wenn Sie viele Alternativen oder eine Menge von Daten, die durch ?s _:prop ?value

Drittes Verfahren angepasst werden kann, ist die VALUES Klausel zu verwenden, die wieder eine SPARQL erfordert 1.1 Umsetzung:

SELECT * WHERE 
{ 
    VALUES (?value) { ("v1") ("v2 ") } 
    ?s _:prop ?value . 

    # Use ?s in other patterns 
} 

Dies ist wahrscheinlich die beste Option, da es zu viele Alternativen besser skaliert (je nach SPARQL-Implementierung) und ist vielleicht das schönste zu lesen und zu schreiben.

2

Das funktioniert gut:

SELECT * 
WHERE 
{ 
    VALUES ?value 
    { 
     "value1" 
     "value2" 
     "etc" 
    } 

    ?s ?p ?value 
} 
Verwandte Themen