我正在尝试实现以下目标:
从特定节点作为起点,获取所有连接的节点,其深度在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 .
答案 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) .
}
}