编程语言
首页 > 编程语言> > 如何在python rdflib中运行IN和NOT IN SPARQL语句来删除两个图的交集

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

作者:互联网

我正在尝试在SPARQL的python实现(现在在rdfextras)中使用IN和NOT 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关键字的情况下执行此操作)

最佳答案:

我尝试了类似的查询,并得到了解析异常.我已经通过了rdflib’s SPARQL parser代码,似乎没有处理IN或NOT IN的规则.我认为这个功能没有实现.

无论如何,我不确定你是否正确使用它.看一下SPARQL 1.1 spec中的NOT IN定义……它定义了用于表达式列表的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>)
}

标签:python,rdflib,sparql
来源: https://codeday.me/bug/20190515/1109182.html