2014-10-29 7 views
7

Questo è probabilmente quasi la stessa quetion come: Filter by language only if the object is a literallingua filtro solo se il tipo è letterale

Il problema è che la risposta c'è non funziona nel mio caso.

ho questa query:

SELECT ?property ?value 
WHERE { <http://dbpedia.org/resource/Facebook> ?property ?value 
FILTER(STRSTARTS(STR(?property), "http://dbpedia.org/property") || STRSTARTS(STR(?property), "http://dbpedia.org/ontology"))} 

Result in Virtuoso

Ci si potrebbe vedere un elenco di proprietà tra cui "rating di Alexa 2" e "astratto" in molte lingue.

Se poi provare la soluzione suggerita per la questione di cui sopra:

SELECT ?property ?value 
WHERE { <http://dbpedia.org/resource/Facebook> ?property ?value 
FILTER(STRSTARTS(STR(?property), "http://dbpedia.org/property") || STRSTARTS(STR(?property), "http://dbpedia.org/ontology")) 
FILTER(!isLiteral(?value) || langMatches(lang(?value), "EN"))} 

Result in Virtuoso

Ora si potrebbe vedere che solo la versione inglese di "astratto" è lì, ma "rating di Alexa 2" e molti altri valori non string sono spariti.

Chiunque sappia come ottenere tutte le proprietà come nella prima query e poi solo per i letterali filtra la lingua inglese?

risposta

9

La seconda query fa esclude i valori letterali con un tag di lingua diverso dall'inglese. In RDF 1.0, ci sono tre tipi di letterali:

  • letterali normale (senza tipo di dati, e nessuna lingua etichetta)
  • contrassegnato come lingua letterali (una stringa e un tag di lingua)
  • letterali tipo di dati (un lessicale forma e un tipo di dati)

così il rating di Alexa, che ha un valore di 2, è un letterale, e non hanno un tag di lingua, in modo che il tag di lingua certamente non è "EN" (e ancora più importante, d o non corrisponde a"EN"; langMatches esegue alcuni controlli più complessi). Quello che vuoi è filtrare i letterali con tag non in lingua inglese.Non è difficile; basta aggiungere lang(?value) = "" al filtro (in quanto ritorna lang "" per letterali senza tag di lingua):

SELECT ?property ?value 
WHERE { <http://dbpedia.org/resource/Facebook> ?property ?value 
FILTER(STRSTARTS(STR(?property), "http://dbpedia.org/property") || STRSTARTS(STR(?property), "http://dbpedia.org/ontology")) 
FILTER(!isLiteral(?value) || lang(?value) = "" || langMatches(lang(?value), "EN"))} 

SPARQL results

Il modo di leggere che il filtro è:

Tenere valori che

  1. non sono letterali; o
  2. sono letterali, ma non hanno un tag di lingua; o
  3. sono letterali con un tag di lingua che corrisponde a "en".
+0

Grazie! Al punto. –

+0

Ottima risposta, chiara e comprensibile! – user2078148

0

Quindi sembra che tu voglia semplicemente invertire la condizione del filtro nella lingua giusta?

In questo caso è sufficiente invertire la chiamata langMatches aggiungendo un ! prima cioè di aggiungere l'operatore not ad esso:

SELECT ?property ?value 
WHERE { <http://dbpedia.org/resource/Facebook> ?property ?value 
FILTER(STRSTARTS(STR(?property), "http://dbpedia.org/property") || STRSTARTS(STR(?property), "http://dbpedia.org/ontology")) 
FILTER(!isLiteral(?value) || !langMatches(lang(?value), "EN"))} 

Result in DBPedia

Con questa semplice modifica le voci in inglese sono ora eliminato e vedo solo le voci non inglesi.

+0

Non penso che sia giusto. Penso che OP voglia mantenere tutti i letterali che non hanno tag di lingua e mantenere solo quei letterali con tag linguistici le cui lingue corrispondono a "en". –