Ale*_*eau 6 python sparql rdflib
我正在尝试在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)
}
Run Code Online (Sandbox Code Playgroud)
也许这个特殊的东西是在SPARQL 1.1中添加的并且不受支持rdfextra,在这种情况下我希望有一个解决方法(或者如何在不使用NOT IN关键字的情况下执行此操作)
我尝试了类似的查询,并得到了解析异常.我已经浏览了rdflib的SPARQL解析器代码,似乎没有规则来处理IN或NOT IN.我认为这个功能没有实现.
无论如何,我不确定你是否正确使用它.有一个看NOT IN在定义SPARQL 1.1规范 ......它定义了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)
}
Run Code Online (Sandbox Code Playgroud)
在不了解您的查询的情况下,我无法就此案例提出更好的建议.
两个查询的解决方法
使用rdlib解决此问题的最简单方法是使用过滤器和两个查询,第一个查询检索所有可能的值?SetB.在动态创建过滤器的第二个查询中使用Ant:
SELECT ?title WHERE {
some logic defining ?item
FILTER (?item != <setb_val1> && ?item != <setb_val2> &&
... && ?item != <setb_val2>)
}
Run Code Online (Sandbox Code Playgroud)