Как с помощью Virtuoso найти расстояние между двумя узлами на графике? Я читал документы Transitivity, но они ограничивают вас одним предикатом, например:
SELECT ?link ?g ?step ?path
WHERE
{
{
SELECT ?s ?o ?g
WHERE
{
graph ?g {?s foaf:knows ?o }
}
} OPTION (TRANSITIVE, t_distinct, t_in(?s), t_out(?o), t_no_cycles, T_shortest_only,
t_step (?s) as ?link, t_step ('path_id') as ?path, t_step ('step_no') as ?step, t_direction 3) .
FILTER (?s= <http://www.w3.org/People/Berners-Lee/card#i>
&& ?o = <http://www.advogato.org/person/mparaz/foaf.rdf#me>)
}
LIMIT 20
Обходит только foaf:knows
, а не любой тип предиката. Как я могу расширить это до «любого предиката»? Мне не нужен фактический путь, просто истина/ложь (запрос ASK). Изменение foaf:knows на ?p кажется излишним.
В настоящее время я выполняю набор рекурсивных ASK, чтобы узнать, связаны ли два узла на определенном расстоянии, но это не кажется эффективным.