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

时间:2011-04-25 15:28:23

标签: python sparql rdflib

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

让我们考虑两组(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关键字的情况下执行此操作)< / p>

2 个答案:

答案 0 :(得分:5)

我尝试过类似的查询,但也有一个解析异常。我已经使用了rdflib's SPARQL parser代码,似乎不存在处理INNOT IN的规则。我认为这个功能没有实现。

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

FILTER (?item NOT IN (?SetB))

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

一个查询的解决方法

可能对您有用的一种可能解决方案是使用OPTIONALbound(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>)
}

答案 1 :(得分:3)

没有具体细节很难回答,但听起来像是你想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有点误导:据我所知,它可以通过列表表达式进行操作,而不是您可以定义的列表。