Sparql Поиск переменной глубины от начального узла - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь добиться следующего:

Получить все подключенные узлы с переменной глубиной (что-то, что я могу указать как параметр?) Между 1 и 5, из определенного узла в качестве отправной точки,

Пример: я хочу найти всех друзей Джима друзей друзей (глубина 2)

До сих пор я потерпел неудачу и смог сделать только глубину 1, добавив дополнительные свойства, подобные этому:

select * where {

   ?Source foaf:name ?Name .
   ?Source foaf:member ?Target .
   ?Target foaf:name ?Name2 .
   ?Source2 foaf:member ?Target2 .
   filter(?Source = <MYIRI>)
}  

Обновление 1: мне удалось добиться чего-то работоспособного, добавив пути:

select distinct * where {
   ?Source foaf:name ?SourceName .
   ?Source foaf:member/foaf:member ?Target .
   ?Target foaf:name ?TargetName .
   filter(?Source = <IRI>)
}

Так что это будет поиск с глубиной 1, и если я хочу глубину 2, у меня будетделать

?Source foaf:member/foaf:member/foaf:member ?Target .

1 Ответ

0 голосов
/ 24 октября 2018

Если максимальная глубина известна (как в вашем случае), вы можете использовать блок UNION и выбрать узлы, достижимые на требуемых расстояниях до максимальной глубины.

Используйте FILTER в каждом блоке этого большого UNION, чтобы включить его решения.Например, что-то вроде следующих строк должно сделать это, просто измените первый BIND на требуемую глубину, или вы можете передать его как обязательный при оценке вашего запроса:

select ?source ?target ?hops where { 
    bind(1 as ?depth) .
    values ?source {<urn:1>}
    { 
        filter (?depth > 0) .
        ?source <urn:p> ?target . bind (1 as ?hops) .
    } union {
        filter (?depth > 1) .
        ?source <urn:p>/<urn:p> ?target . 
        bind (2 as ?hops) .
    } union {
        filter (?depth > 2) .
        ?source <urn:p>/<urn:p>/<urn:p> ?target . 
        bind (3 as ?hops) .
    } union {
        filter (?depth > 3) .
        ?source <urn:p>/<urn:p>/<urn:p>/<urn:p> ?target . 
        bind (4 as ?hops) .
    } union {
        ?source <urn:p>/<urn:p>/<urn:p>/<urn:p>/<urn:p> ?target . 
        bind (5 as ?hops) .
    }
}
...