如何编写SPARQL查询获取与当前节点最大距离为2的节点
错误原因
你原有查询无法返回第二层节点的核心问题是OPTIONAL子句中复用了第一层的谓词变量?p,这会强制要求第二层关联的谓词必须和第一层关联的谓词完全一致,自然会丢失大量不同谓词的关联结果,甚至多数场景下没有匹配结果。
比如在你给出的人员RDF示例中,查询p:p1的关联时,第一层会匹配到p:p1 p:name "Jack"三元组,此时?p取值为p:name,原有写法要求"Jack" p:name ?oo,字面量无法作为三元组主语,自然不会有返回结果。
修正后的查询(目标节点作为主语的出边场景)
要实现最大距离为2、任意谓词的关联查询,只需要把两层的谓词用独立变量区分即可:
PREFIX id: <http://my.org/graph#> SELECT ?s ?p1 ?o ?p2 ?oo WHERE { # 第一层:目标节点作为主语的所有出边关联 ?s ?p1 ?o . # 第二层:第一层关联节点作为主语的所有出边关联,不受第一层谓词限制 OPTIONAL { ?o ?p2 ?oo . } # 固定目标节点 FILTER( ?s = id:12345 ) }
扩展写法(包含指向目标节点的入边)
如果你需要覆盖所有和目标节点直接关联的边,包括目标节点作为宾语的入边,可以用UNION匹配双向关联:
PREFIX id: <http://my.org/graph#> SELECT ?target ?rel1 ?connectedNode ?rel2 ?secondLevelNode WHERE { # 匹配目标节点所有直接关联,不限制边方向 { id:12345 ?rel1 ?connectedNode . BIND(id:12345 AS ?target) } UNION { ?connectedNode ?rel1 id:12345 . BIND(id:12345 AS ?target) } # 匹配直接关联节点的所有出边作为第二层节点 OPTIONAL { ?connectedNode ?rel2 ?secondLevelNode . } }
内容的提问来源于stack exchange,提问作者tenticon
相关产品推荐
相关产品推荐

