下面是一些包含四个类的示例数据。第一类和第二类包含名称为“name1”和“name2”的孩子。第三类包含“name1”和“name3”,第四类包含“name3”和“name4”。第五类包含第四类的所有孩子,以及“name5”。所以,第一类和第二类是等价的,第四类是第五类的子类。
@prefix : <http://example.org/> .
:class1 :child [ :objectName "name1" ] ,
[ :objectName "name2" ] .
:class2 :child [ :objectName "name2" ] ,
[ :objectName "name1" ] .
:class3 :child [ :objectName "name1" ] ,
[ :objectName "name3" ] .
:class4 :child [ :objectName "name3" ] ,
[ :objectName "name4" ] .
:class5 :child [ :objectName "name3" ] ,
[ :objectName "name4" ] ,
[ :objectName "name5" ] .
你的描述听起来像你实际上是寻找子类,因为你提到的类其所有的孩子也在另一个类。因此,该SPARQL查询应该找到的子类关系的护理:
prefix : <http://example.org/>
select distinct ?c1 ?c2 where {
?c1 :child [] .
?c2 :child [] .
NOT EXISTS { ?c1 :child [ :objectName ?name ] .
NOT EXISTS { ?c2 :child [ :objectName ?name ] } }
FILTER(!sameTerm(?c1, ?c2))
}
嵌套NOT EXIST
模式确保我们选择的唯一类是这样的,有做NOT EXIST
元素?c1
这确实NOT EXIST
在?c2
。也就是说,我们拒绝任何成对的集合,其中是?c1
中的元素,其不在?c2
中;我们拒绝任何?c1,?c2
对,其中?c1
是不的?c2
一个子集,因此我们保持只是那些地方?c1
是的?c2
一个子集。 sameTerm
过滤器会删除简单的?c,?c
对,因为所有内容都是其自身的子集。耶拿使用的命令行工具ARQ,我们得到这些结果:
$ arq --data data.n3 --query query.sparql
---------------------
| c1 | c2 |
=====================
| :class4 | :class5 |
| :class2 | :class1 |
| :class1 | :class2 |
---------------------
正如预期的那样,:class1
和:class2
是其他的每个子集,并:class4
是:class5
一个子集。
如果你想等价类,它是足够的,只是第二NOT EXISTS
确保?c2
也是?c1
一个子集:
prefix : <http://example.org/>
select distinct ?c1 ?c2 where {
?c1 :child [] .
?c2 :child [] .
NOT EXISTS { ?c1 :child [ :objectName ?name ] .
NOT EXISTS { ?c2 :child [ :objectName ?name ] } }
NOT EXISTS { ?c2 :child [ :objectName ?name ] .
NOT EXISTS { ?c1 :child [ :objectName ?name ] } }
FILTER(!sameTerm(?c1, ?c2))
}
有了这个查询,我们回来只是:class1
和:class2
:
$ arq --data data.n3 --query query.sparql
---------------------
| c1 | c2 |
=====================
| :class2 | :class1 |
| :class1 | :class2 |
---------------------
有关于计算SPARQL子集的[最近的问题](http://stackoverflow.com/questions/17323636/comparing-sparql-graphs/17344570#17344570)。这个问题涉及到检查一个命名图是否是另一个命名图的子集,但是其中一些技术可能适用于这里,您要查找该集{'?x':'class1:child?x'}是否为子集{'?x':'class2:child?x'}。 –
你说过“重复”班,但是“所有一个班的孩子都在另一班。”除非所有第二班的孩子都在第一堂课,否则你只会谈论_sub_-class,而不是_equivalent_-class。你打算如何? –