我有一个SPARQL查询,旨在检索一个特定类的所有实例,这些实例与另一个特定类的实例相邻。例如:
SELECT ?origin ?dependent WHERE {
?origin a :type1 .
?origin ?somePredicate ?dependent.
?dependent a :type2 .
}假设上面查询的结果如下所示:
?origin ?dependent
node1 node3
node1 node4
node2 node5
node2 node6因此,在本例中,有两个指定类型的节点同时连接到node1和node2。现在,我想将结果限制为那些?dependent结果,其中这两个节点中至少有一个不是特定三元组的主题,但在只有一个节点具有三元组的情况下,仍然返回这两个节点。
假设图中存在以下三元组:
node4 :isSubjectOf :thisTriple .
node5 :isSubjectOf :thisTriple .
node6 :isSubjectOf :thisTriple .让我们假设node3是节点3-6中唯一没有这个特定三元组的节点。现在,我想要编写一个查询,使我的结果集看起来像这样:
?origin ?dependent
node1 node3
node1 node4我希望我的问题表达得足够好,可以让人理解。有没有什么方便有效的SPARQL技术来完成这样的事情?如果可能的话,我更愿意避免使用FILTER。
发布于 2017-08-05 00:29:42
这就是我对你的数据的设想:
@prefix ns0: <http://example.com/> .
<http://example.com/node1>
a <http://example.com/type1> ;
ns0:somePredicate ns0:node3, ns0:node4 .
ns0:node2
a ns0:type1 ;
ns0:somePredicate ns0:node5, ns0:node6 .
ns0:node3
a ns0:type2 ;
ns0:isSubjectOf ns0:thisTriple .
ns0:node4 a ns0:type2 .
ns0:node5 a ns0:type2 .
ns0:node6 a ns0:type2 .这是一个可以得到你想要的东西的查询。可以在相同的主语和宾语之间创建不同的三元组模式,只要对绑定它们的谓词使用不同的变量名即可。
PREFIX : <http://example.com/>
SELECT ?origin ?dependent
WHERE
{ ?origin a :type1 ;
?somePredicate ?dependent .
?dependent a :type2 .
?origin ?anyPred ?theSubj .
?theSubj :isSubjectOf ?theTrip
}结果是:
+--------+-----------+
| origin | dependent |
+--------+-----------+
| :node1 | :node3 |
| :node1 | :node4 |
+--------+-----------+https://stackoverflow.com/questions/45511202
复制相似问题