2012-01-20 15 views
8

Fondamentalmente ho una query (mostrata sotto) che funziona in modo efficiente. Tuttavia, desidero che la mia ricerca sia più precisa in cui l'etichetta è la stringa effettiva "yago" anziché contenere la stringa "yago". Voglio provare a farlo senza filtri, se possibile, perché penso che l'uso di FILTER rende più lunghe le query su DBpedia.DBpedia SPARQL Interrogazione per un rdf specifico: etichetta

SELECT ?uri ?label 
WHERE { 
?uri rdfs:label ?label. 
?label bif:contains "'yago'" . 
} 

risposta

13

Si può provare a fare quanto segue se si vuole farlo senza filtri:

SELECT ?uri ?label 
WHERE { 
?uri rdfs:label "Yago"@en . 
?uri rdfs:label ?label 
} 

io non sono sicuro se se è molto più veloce rispetto al corrispondente query con filtri:

SELECT ?uri ?label 
WHERE { 
?uri rdfs:label ?label . 
filter(?label="Yago"@en) 
} 
+2

Credo che la tua prima query abbia il triplo schema duplicato. –

+1

grazie alla seconda query è più efficiente senza duplicazione – Sam

3

Una correzione chiave per la risposta originale. Se si dispone di una corrispondenza esatta, con l'etichetta lingua, quindi la seguente funzionerà:

SELECT ?uit ?label 
WHERE { 
    ?uri rdfs:label "Yago"@en . 
} 

Se, tuttavia, la corrispondenza esatta non può utilizzare ciò che si vuole, SPARQL supporta un'espressione regolare di serie:

SELECT ?uit ?label 
WHERE { 
    ?uri rdfs:label ?label . 
    FILTER regex(str(?label), "yago", "i") 
} 

... che corrisponde alla stringa indipendentemente dal caso del personaggio, e puoi giocare ai soliti giochi regex per ottenere la corrispondenza di stringa richiesta. (Naturalmente, altre funzioni di stringa, come STRSTARTS e STRENDS saranno più efficienti se soddisfano i criteri di corrispondenza desiderati.)

Problemi correlati