SPARQL: ¿hay alguna ruta entre dos nodos?

¿Existe un buen tipo de consulta SPARQL que me permita responder si dos nodos dados están conectados en un solo / múltiples puntos finales SPARQL?

Digamos que quiero verificar si los dos nodos

 

y

  

estan conectados. Si es así, me interesaría el camino.

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

 SELECT * WHERE {  ?p1 ?n1. # SERVICE  {  ?p2 ?n1 . # } } 

pruébate

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

Conozco 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 camino, por lo que los predicados en la ruta pueden cambiar.

Mi enfoque actual (como me parece ridículo) es consultar todos los caminos posibles de longitud k hasta un límite de n .

Dumping no es una opción para mí, ya que es miles de millones de triples … ¡Quiero usar SPARQL!

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 o no propiedad. Por ejemplo, (<>|!<>) Coincide con cualquier propiedad, ya que cada propiedad es <> o no lo es. Puede crear un comodín que vaya en cualquier dirección alternando eso consigo mismo en la otra dirección: (<>|!<>)|^(<>|!<>) . Eso significa que hay un camino, 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 (lo que indica que hay una ruta):

 ASK {  ((<>|!<>)|^(<>|!<>))*  } 

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

 ?start * ?u . ?u ?p ?v . ?v * ?end . 

Entonces? U,? Py v te dan todos los bordes del camino. Tenga en cuenta que si hay varias rutas, obtendrá todos los bordes de todas las rutas. Dado que tus comodines van en cualquier dirección, puedes llegar a cualquier cosa accesible desde el principio o el final, por lo que deberías considerar restringir el comodín de alguna manera.

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

Tenga en cuenta que esto será trivialmente satisfecho en muchos casos si tiene algún tipo de inferencia. Por ejemplo, si está utilizando OWL, entonces cada individuo es una instancia de búho: Cosa, por lo que siempre habrá una ruta de acceso del formulario:

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