2012-01-20 13 views
8
etiqueta

Básicamente tengo una consulta (que se muestra a continuación) que funciona de manera eficiente. Sin embargo, quiero que mi búsqueda sea más precisa cuando la etiqueta es la cadena real 'yago' en lugar de contener la cadena 'yago'. Quiero intentar hacerlo sin filtros si es posible, ya que creo que el uso de FILTER hace que consultar DBpedia tome más tiempo.DBpedia SPARQL Consulta por rdfs específicos:

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

Respuesta

13

Usted puede intentar hacer lo siguiente si quiere hacerlo sin filtros:

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

Yo no estoy seguro de que si es mucho más rápido que la consulta correspondiente con filtros:

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

Creo que su primera consulta tiene el patrón triple duplicado. –

+1

gracias la segunda consulta es más eficiente sin duplicación – Sam

3

Una corrección clave para la respuesta original. Si usted tiene una coincidencia exacta, con la etiqueta de idioma, entonces el siguiente trabajo:

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

Si, sin embargo, la coincidencia exacta no puede estar usando lo que quiere, SPARQL es compatible con una expresión regular estándar:

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

... que coincidirá con la cadena independientemente de la caja de caracteres, y puede jugar los juegos regulares de expresiones regulares para obtener la coincidencia de cadena requerida. (Por supuesto, otras funciones de cadena, como STRSTARTS y STRENDS serán más eficientes si cumplen con los criterios de coincidencia deseados).

Cuestiones relacionadas