2013-07-11 31 views
12

In SPARQL possiamo fare qualcosa di simileselezionare più valori come oggetto nel modello SPARQL

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

E 'possibile fare lo stesso per la parte oggetto del modello? E quali sono alcune soluzioni alternative nel caso in cui non fosse possibile?

Ad esempio:

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

risposta

18

Ci sono alcuni modi per farlo. Il metodo SPARQL 1.0 più semplice e puro è quello di utilizzare UNION ad es.

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

    # Use ?s in other patterns 
} 

Questo è probabilmente il metodo più semplice, ma se avete bisogno di più vincoli su ?s questo può ottenere rapidamente ingombrante.

Il secondo metodo consiste nell'utilizzare la funzione IN in una clausola FILTER, che richiede un'implementazione SPARQL 1.1 ad es.

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

    # Use ?s in other patterns 
} 

problema qui è che l'utilizzo IN può eseguire molto male se si dispone di molte alternative o un sacco di dati che può essere accompagnata da ?s _:prop ?value

terzo metodo è quello di utilizzare la clausola VALUES che richiede ancora una volta uno SPARQL 1.1 implementazione:

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

    # Use ?s in other patterns 
} 

Questo è probabilmente l'opzione migliore dal momento che le scale a molte alternative migliori (a seconda dell'implementazione SPARQL) ed è forse la più bella a leggere e scrivere.

2

Questo metodo funziona bene:

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

    ?s ?p ?value 
}