如何在python rdflib中运行IN和NOT IN SPARQL语句以删除两个图的交集

| 我正在尝试在SPARQL的python实现(现在在rdfextras中)上使用
IN
NOT IN
语句(如果我理解正确的话,是在SPARQL 1.1中引入的),但似乎语法无法识别。 让我们考虑两个集合(A和B)。我想输出集合A中的内容,删除集合B中的内容。
SELECT ?title WHERE {
   some logic defining ?item and ?SetB
   FILTER (?item NOT IN ?SetB)
}
也许这个特殊的东西是SPARQL 1.1中添加的,但
rdfextra
不支持,在这种情况下,我希望有一种解决方法(或者不使用
NOT IN
关键字如何进行操作)     
已邀请:
我尝试了类似的查询,并且也遇到了解析异常。我已经看过rdflib的SPARQL解析器代码,它似乎不存在处理
IN
NOT IN
的规则。我将假定未实现此功能。 无论如何,我不确定您是否正确使用它。看一下SPARQL 1.1规范中的
NOT IN
定义...,它定义了针对表达式列表使用的
IN
运算符。因此,您可以执行以下操作:
FILTER (?item NOT IN (?SetB))
我不确定您是否可以在右侧使用变量,因为规范中的所有示例均使用术语。编辑:请参阅RobV消息,可以在RLH中使用变量 一个查询的解决方法 一种可能适合您的解决方案是使用
OPTIONAL
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>)
}
    
没有细节很难回答,但听起来像是要want15ѭ:
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
有点令人误解:据我所知,它对列表表达式进行操作,而不是对您可以定义的列表进行操作。     

要回复问题请先登录注册