为解释我的问题,我将举一个富有成果的例子:
比方说,我们有一个RDF三层商店,其中包含3个类:
:Apple
:Orange
:Pear
我们有1个属性:
:friendsWith
苹果,橙子和梨可以和其他苹果,橙子和梨成为朋友。 我要实现的查询是:
“给苹果/ 123,请给我所有苹果和梨,其中除橙子外,苹果/ 123是朋友。”
此SPARQL查询的当前版本如下:
SELECT DISTINCT ?appleOrPear WHERE {
<apple/123> :friendsWith* ?appleOrPear .
FILTER NOT EXISTS {?appleOrPear a :Orange.}
}
此查询确实确实只给我连接到apple / 123的苹果和梨。但是,这也会给我苹果和梨通过橙子相连,这是我不想要的。
所以我需要的是一种在查询的套利路径部分完成之前对结果进行过滤的方法。换句话说,对于整个查询,我想忽略整个:orange类。
在SPARQL中有什么方法可以做到吗?
答案 0 :(得分:1)
您可以检查:Orange
和:friendsWith
之间的<apple/123>
链中是否没有类型为?appleOrPear
的节点。
SELECT distinct ?appleOrPear WHERE {
<apple/123> :friendsWith* ?appleOrPear .
filter not exists {
<apple/123> :friendsWith* ?x .
?x :friendsWith* ?appleOrPear .
?x a :Orange .
}
}