2011-10-29 17 views
18

Ho alcune triple che assomigliano a questo:SPARQL selezionare opzionale con il linguaggio

test:thing rdfs:label "Non-Language Label" 
test:thing rdfs:label "English Label"@en 
test:thing rdfs:label "French Label"@fr 

mi piacerebbe formare una query SPARQL che me il "Label non linguistiche" e la "etichetta francese" dà, se esiste.

Ho provato questo e non funziona:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
SELECT ?label ?preferredLabel 
WHERE { 
    test:thing rdfs:label ?label 
    OPTIONAL { 
    test:thing rdfs:label ?preferredLabel . 
    FILTER (regex(str(?preferredLabel), '(^|\\\\W)fr', 'i')) 
    } 
} 

Grazie in anticipo!

risposta

21

non vedo il motivo per cui è necessario OPTIONAL qui a tutti. La query di Jan non funziona perché non esiste una variabile condivisa tra il modello esterno e l'opzionale, quindi stai provando a calcolare il prodotto incrociato di ogni etichetta per test:thing con qualsiasi etichetta francese/non identificata test:thing che potrebbe essere enorme e perché il processore di query non funziona.

volete semplicemente qualcosa di simile a quanto segue se non ho frainteso la tua domanda

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
SELECT ?label 
WHERE 
{ 
    test:thing rdfs:label ?label 
    FILTER(LANG(?label) = "" || LANGMATCHES(LANG(?label), "fr")) 
} 

Se si desidera che le due etichette a parte, allora si potrebbe fare qualcosa di simile:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
SELECT ?label ?preferredLabel 
WHERE 
{ 
    { 
    test:thing rdfs:label ?label . FILTER(LANG(?label) = "") 
    } 
    UNION 
    { 
    test:thing rdfs:label ?preferredLabel . FILTER(LANGMATCHES(LANG(?label), "fr")) 
    } 
} 
+0

Mi hai messo sulla buona strada !!! Grazie!!! –

4

Il modo più semplice per verificare la lingua dei valori letterali consiste nell'utilizzare la funzione lang(). Usando questo, la query può essere scritta come:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX test: <http://test#> 
SELECT ?label ?preferredLabel 
WHERE { 
    test:thing rdfs:label ?label 
    OPTIONAL { 
    test:thing rdfs:label ?preferredLabel . 
    FILTER (lang(?preferredLabel) = "" || lang(?preferredLabel) = "fr") 
    } 
} 
+0

Hi - grazie per l'aiuto. Hai ragione ad aggiungere nella logica del filtro da qualche parte, che sembra essere buono. Questa query ha solo errori per me. Penso che il problema inizi con me selezionando fondamentalmente gli stessi dati due volte (come? Label e come? PreferredLabel). Mi piacerebbe avere l'etichetta? E l'etichetta? Preferred nello stesso record. Sono rimasto perplesso per un po 'su questo - apparentemente semplice, ma non così tanto! Grazie per l'aiuto –

2
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
SELECT ?uri ?label ?preferredLabel 
WHERE 
{ 
    { 
    ?uri rdfs:label ?label . FILTER(LANG(?label) = "" && regex(str(?label), '(^|\\\\W)fr', 'i')) 
    } 
    UNION 
    { 
    ?uri rdfs:label ?preferredLabel . FILTER(LANG(?preferredLabel) = "fr" && regex(str(?preferredLabel), '(^|\\\\W)fr', 'i')) 
    } 
}