我尝试了类似的查询,也得到了解析异常。我已经浏览了rdflib 的 SPARQL 解析器代码,它似乎不存在处理IN
或NOT IN
. 我会假设这个功能没有实现。
无论如何,我不确定您是否正确使用它。查看SPARQL 1.1 规范NOT IN
中的定义......它定义了要针对表达式列表使用的运算符。因此,你会这样做:IN
FILTER (?item NOT IN (?SetB))
而且我不完全确定您是否可以在右侧使用变量,因为规范中的所有示例都使用术语。 编辑:见 RobV 消息,可以在 RLH 中使用变量
一个查询的解决方法
一种可能对您有用的解决方案是使用OPTIONAL
and 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>)
}