7

我正在尝试在 SPARQL 的 python 实现(现在在rdfextrasIN中)上使用andNOT IN语句(如果我理解正确,在 SPARQL 1.1 中引入),但似乎无法识别语法。

让我们考虑两个集合(A 和 B)。我想输出 Set A 中的内容,删除 Set B 中的内容。

SELECT ?title WHERE {
   some logic defining ?item and ?SetB
   FILTER (?item NOT IN ?SetB)
}

也许这个特殊的东西是在 SPARQL 1.1 中添加的并且不受支持rdfextra,在这种情况下,我希望有一个解决方法(或者如何在不使用NOT IN关键字的情况下做到这一点)

4

2 回答 2

7

我尝试了类似的查询,也得到了解析异常。我已经浏览了rdflib 的 SPARQL 解析器代码,它似乎不存在处理INNOT IN. 我会假设这个功能没有实现。

无论如何,我不确定您是否正确使用它。查看SPARQL 1.1 规范NOT IN中的定义......它定义了要针对表达式列表使用的运算符。因此,你会这样做:IN

FILTER (?item NOT IN (?SetB))

而且我不完全确定您是否可以在右侧使用变量,因为规范中的所有示例都使用术语。 编辑:见 RobV 消息,可以在 RLH 中使用变量

一个查询的解决方法

一种可能对您有用的解决方案是使用OPTIONALand bound(两者都在 rdflib 中受支持)。就像是 ...

SELECT ?title WHERE {
   some logic defining ?item
   OPTIONAL {
   some logic defining ?SetB
   }
   FILTER (bound(?SetB) && ?setB != ?item)
}

在不了解您的查询的情况下,我无法对这种情况提出更好的建议。

两个查询的解决方法

使用 rdlib 解决此问题的最简单方法是使用过滤器和两个查询,第一个查询检索?SetB. Ant 在第二个查询中动态创建一个过滤器:

SELECT ?title WHERE {
   some logic defining ?item
   FILTER (?item != <setb_val1> && ?item != <setb_val2> &&
   ... && ?item != <setb_val2>)
}
于 2011-04-25T19:53:12.147 回答
4

没有具体细节很难回答,但听起来你想要MINUS

SELECT ?title WHERE {
    ?item ... ITEM CRITERIA ...
    MINUS { ?item ... SET CRITERIA ... }
}

例如:

SELECT ?title WHERE {
    ?item ex:colour "red" .       # item is red
    MINUS { ?item ex:size "big" } # but not in set of big things
}

NOT IN有点误导:据我所知,它对列表表达式进行操作,而不是您可以定义的列表。

于 2011-04-25T19:53:27.713 回答