为了解释我的问题,我将给出一个果味的例子:
假设我们有一个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的苹果和梨。然而它也会给我苹果和梨通过橙子连接,我不想要。
所以我需要的是在查询的任意路径部分完成之前过滤结果的方法。换句话说,我想忽略整个:整个查询的橙色类。
有没有办法在SPARQL中执行此操作?
您可以检查: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 .
}
}