从起始节点进行Sparql可变深度搜索

时间:2018-10-20 20:26:52

标签: sparql

我正在尝试实现以下目标:

从特定节点作为起点,获取所有连接的节点,其深度在1到5之间,且深度可变(我可以指定为参数吗?)。

示例:我想找到Jim的所有朋友,朋友的朋友(深度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 :(得分:0)

如果已知最大深度(在您的情况下是这样),则可以使用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) .
    }
}