我有一个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
。
这就是我对数据的设想:
@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 |
+--------+-----------+