微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SPARQL - 获取到当前节点最大距离为 2 的节点

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?