sparql

SPARQL: ¿hay alguna ruta entre dos nodos?



(1)

Si bien no puede usar variables en las rutas de propiedad, puede usar un comodín aprovechando el hecho de que para cualquier URI, cada propiedad es esa propiedad o no. Por ejemplo, (<>|!<>) Coincide con cualquier propiedad, ya que cada propiedad es <> o no lo es. Puede hacer un comodín que vaya en cualquier dirección alternando eso consigo mismo en la otra dirección: (<>|!<>)|^(<>|!<>) . Eso significa que hay una ruta, con propiedades que van en cualquier dirección, entre dos nodos? U y? V cuando

?u ((<>|!<>)|^(<>|!<>))* ?v

Por ejemplo, la siguiente consulta debería devolver verdadero (indicando que hay una ruta):

ASK { <http://wiktionary.dbpedia.org/resource/dog> ((<>|!<>)|^(<>|!<>))* <http://dbpedia.org/resource/Dog> }

Ahora, para obtener realmente los enlaces de una ruta entre dos nodos, puede hacerlo (dejando que <wildcard> represente el comodín de aspecto desagradable):

?start <wildcard>* ?u . ?u ?p ?v . ?v <wildcard>* ?end .

Entonces? U,? P, y? V le dan todos los bordes en el camino. Tenga en cuenta que si hay varias rutas, obtendrá todos los bordes de todas las rutas. Como sus comodines van en cualquier dirección, puede llegar a cualquier cosa accesible desde el "inicio" o el "final", por lo que debería considerar restringir el comodín de alguna manera.

En el punto final al que se vinculó, no lo hace, pero parece ser un problema con la implementación de las rutas de propiedades de Virtuoso, en lugar de un problema con la consulta real.

Tenga en cuenta que esto se cumplirá trivialmente en muchos casos si tiene algún tipo de inferencia. Por ejemplo, si está usando OWL, entonces cada individuo es una instancia de owl: Thing, por lo que siempre habrá una ruta de la forma:

? u → rdf: tipo búho: Cosa ← rdf: tipo ? v

¿Existe un buen tipo de consulta SPARQL que me permita responder si dos nodos dados están conectados en uno o varios puntos finales SPARQL?

Digamos que quiero verificar si los dos nodos

<http://wiktionary.dbpedia.org/resource/dog>

y

<http://dbpedia.org/resource/Dog>

estan conectados. En caso afirmativo, estaría interesado en el camino.

Suponiendo que ya sabía que estaban conectados a través de la etiqueta, por lo que una consulta como esta devuelve una ruta de longitud 3:

SELECT * WHERE { <http://wiktionary.dbpedia.org/resource/dog> ?p1 ?n1. # SERVICE <http://dbpedia.org/sparql> { <http://dbpedia.org/resource/Dog> ?p2 ?n1 . # } }

pruébate

Ahora, ¿qué pasa si todavía no tengo una idea y quiero hacer esto automáticamente y con una longitud y dirección arbitrarias?

Soy consciente de las rutas de propiedad de SPARQL 1.1, pero solo parecen funcionar para propiedades conocidas ( http://www.w3.org/TR/sparql11-query/#propertypaths ):

Las variables no se pueden usar como parte de la ruta en sí, solo los extremos.

También me gustaría permitir cualquier ruta, por lo que los predicados en la ruta pueden cambiar.

Mi enfoque actual (como me parece ridículo) es consultar todas las rutas posibles de longitud k hasta un límite de n .

El dumping no es una opción para mí, ya que son miles de millones de triples ... ¡Quiero usar SPARQL!