Cómo escribir consulta SPARQL que de manera eficiente las coincidencias literales de cadena, mientras se ignora caso

StackOverflow https://stackoverflow.com//questions/10660030

  •  11-12-2019
  •  | 
  •  

Pregunta

Yo estoy usando el de Jena ARQ escribir una consulta SPARQL contra un grande de la ontología se leen de Jena TDB con el fin de encontrar los tipos asociados con conceptos basados en rdfs etiqueta:

SELECT DISTINCT ?type WHERE {
 ?x <http://www.w3.org/2000/01/rdf-schema#label> "aspirin" .
 ?x <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type .
}

Esto funciona bastante bien y es bastante rápido (<1 segundo).Por desgracia, para algunos términos, las necesito para realizar esta consulta en un caso insensible manera.Por ejemplo, porque la etiqueta "Tylenol" es en la ontología, pero no "tylenol", la siguiente consulta viene con las manos vacías:

SELECT DISTINCT ?type WHERE {
 ?x <http://www.w3.org/2000/01/rdf-schema#label> "tylenol" .
 ?x <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type .
}

Puedo escribir un insensible a mayúsculas-versión de esta consulta utilizando la sintaxis del FILTRO así:

SELECT DISTINCT ?type WHERE {
 ?x <http://www.w3.org/2000/01/rdf-schema#label> ?term .
 ?x <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type .
 FILTER ( regex (str(?term), "tylenol", "i") )
}

Pero ahora la consulta tarda más de un minuto para completar!Es allí cualquier manera de escribir las mayúsculas y minúsculas de la consulta de una manera más eficiente?

¿Fue útil?

Solución

La razón por la que la consulta con la consulta de filtro se ejecuta más lenta se debe a que? El término es unido, requiere escanear el PSO o el índice POS para encontrar todas las declaraciones con el RDFS: Predicado de etiquetas y filtrarlos contra la RIGEX.Cuando estuvo obligado a un recurso concreto (en su primer ejemplo), podría usar un índice OPS o POS para escanear solo las declaraciones con el predicado de la etiqueta RDFS: Etiqueta y el recurso de objeto especificado, que tendría una cardinalidad mucho menor.

La solución común a este tipo de problema de búsqueda de texto es usar un índice de texto externo.En este caso, JENA proporciona un índice de texto gratuito llamado Larq , que usaLucene para realizar la búsqueda y se une a los resultados con el resto de la consulta.

Otros consejos

De todas las posibles cadena de operadores que se pueden utilizar en SPARQL, regex es probablemente el más caro.Su consulta puede correr más rápido si usted evitar regex y uso UCASE o LCASE en ambos lados de la prueba en su lugar.Algo así como:

SELECT DISTINCT ?type WHERE {
 ?x <http://www.w3.org/2000/01/rdf-schema#label> ?term .
 ?x <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type .
 FILTER (lcase(str(?term)) = "tylenol")
}

Esto puede ser más rápido, pero en general no se espera un gran rendimiento para la búsqueda de texto con cualquier triple de la tienda.Triple tiendas están muy bien en el gráfico correspondiente y no tan bueno en la cadena coincidente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top