如何解决SPARQL - 获取到当前节点最大距离为 2 的节点
给定 RDF 数据库中的特定节点 http://my.org/nodes#n1
,我想获取链接到 n1
的所有节点(通过各种谓词),然后再次(如果可能)获取所有节点连接到这些节点。
例如,给出以下关于人和他们是朋友的图表:
@prefix p: <http://helloworld.org/person#> .
@prefix r: <http://helloworld.org/relation#> .
@prefix l: <http://helloworld.org/location#> .
l:l1 l:city "Sydney" .
l:l2 l:city "Paris" .
l:l3 l:city "New York" .
p:p1
p:name "Jack" ;
p:age 30 ;
p:livingIn l:l1 .
p:p2
p:name "Peter" ;
p:age 31 ;
p:livingIn l:l1 .
p:p3
p:name "Carol" ;
p:age 32 ;
p:livingIn l:l1 .
p:p4
p:name "Anna" ;
p:age 33 ;
p:livingIn l:l2 .
p:p5
p:name "Chris" ;
p:age 34 ;
p:livingIn l:l3 .
p:p1
r:isFriendOf p:p2 ;
r:isFriendOf p:p3 .
p:p3 r:isFriendOf p:p4 .
p:p4 r:isFriendOf p:p5 .
我知道节点 (isFriendOf
) 之间只有一种关系,因此查询 Jack
的朋友和他们的朋友很容易
PREFIX p: <http://helloworld.org/person#>
PREFIX r: <http://helloworld.org/relation#>
SELECT ?name ?friend ?foaf
WHERE {
?p r:isFriendOf ?o .
?p p:name ?name .
?o p:name ?friend .
OPTIONAL {
?o r:isFriendOf ?fo .
?fo p:name ?foaf
}
FILTER ( ?p = p:p1 )
}
姓名 | 朋友 | 泡沫 |
---|---|---|
“杰克” | “彼得” | |
“杰克” | “卡罗尔” | “安娜” |
然而,对于具有许多关系的更复杂的图形,我很难得到结果。我开始于
PREFIX id: <http://my.org/graph#>
SELECT ?s ?p ?o ?oo
WHERE {
?s ?p ?o .
OPTIONAL { ?o ?p ?oo . } # if an object has connections,get those as well
FILTER( ?s = id:12345 ) # id:12345 is the node we focus on
}
但是 { ?o ?p ?oo }
部分没有给我任何东西..
解决方法
您所过滤的节点 (id:12345) 在您发布的图表中不存在。
您使用的查询有两个问题:1) 您将感兴趣的资源 (id:12345) 和对象 (o) 之间的属性限制为与 ?o 和 ?oo 之间的属性相同,2) 查询效率低下,因为您正在检索完整图,然后按感兴趣的节点进行过滤。相反,您可以执行以下操作:
PREFIX id: <http://my.org/graph#>
SELECT ?s ?p ?o ?p1 ?oo
WHERE {
id:12345 ?p ?o .
OPTIONAL { ?o ?p1 ?oo . }
}
如果您需要一个示例,请在 https://dbpedia.org/sparql
中尝试以下操作select ?p ?o ?p1 ?oo where{
<http://dbpedia.org/resource/Madrid> ?p ?o
optional {?o ?p1 ?oo}
}
第一个结果类似于:
p o p1 oo
http://www.w3.org/1999/02/22-rdf-syntax-ns#type http://dbpedia.org/ontology/Place http://www.w3.org/1999/02/22-rdf-syntax-ns#type http://www.w3.org/2002/07/owl#Class
这是有道理的:马德里是一个地方,地方是一个班级。
请注意,这仅获取传出链接,而不是指向感兴趣节点的传入链接。为此,您必须执行以下操作:
select ?s1 ?p1 ?s ?p where{
?s ?p <http://dbpedia.org/resource/Madrid>
optional {?s1 ?p1 ?s}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。