2013-07-11 29 views
12

W SPARQL możemy zrobić coś takiegowybrać wiele wartości jako obiekt w SPARQL wzór

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

Czy to możliwe, aby zrobić to samo w odniesieniu do części obiektu wzorca? A jakie są tego rozwiązania, na wypadek gdyby nie było to możliwe?

Na przykład:

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

Odpowiedz

18

Istnieje kilka sposobów, aby to zrobić. Najprostszą i czystą metodą SPARQL 1.0 jest użycie UNION np.

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

    # Use ?s in other patterns 
} 

To chyba najprostsza metoda, ale jeśli trzeba wiele ograniczeń na ?s może szybko dostać nieporęczny.

Druga metoda polega na użyciu funkcji IN w klauzuli FILTER, wymaga to implementacji SPARQL 1.1, np.

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

    # Use ?s in other patterns 
} 

problemem jest to, że za pomocą IN można wykonać bardzo słabo, jeśli masz wiele alternatyw lub dużej ilości danych, które mogą być dopasowane przez ?s _:prop ?value

Trzecim sposobem jest użycie klauzuli VALUES co znowu wymaga sparql 1.1 realizacja:

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

    # Use ?s in other patterns 
} 

jest to prawdopodobnie najlepsza opcja, ponieważ skaluje go do wielu alternatyw lepiej (w zależności od implementacji SPARQL) i jest chyba najładniejszy się czytać i pisać.

2

Działa to dobrze:

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

    ?s ?p ?value 
}