【问题标题】:How to run IN and NOT IN SPARQL statements in python rdflib to remove the intersection of two graphs如何在 python rdflib 中运行 IN 和 NOT IN SPARQL 语句以删除两个图的交集
【发布时间】:2011-04-25 15:28:22
【问题描述】:

我正在尝试在 SPARQL 的 python 实现(现在在 rdfextras)上使用 INNOT 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 关键字的情况下做到这一点)

【问题讨论】:

    标签: python sparql rdflib


    【解决方案1】:

    我尝试过类似的查询,但也遇到了解析异常。我浏览了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>)
    }
    

    【讨论】:

    • 这就是我想要的。
    • 在 IN/NOT IN 表达式的 RHS 中使用变量应该是合法的,RHS 在 1.1 语法中定义为 ExpressionList,它允许任何 Expression 产生式列表,即任何有效的表达式,因此这应该包括变量
    • 很高兴知道,谢谢 Rob。规范中的示例有点误导。
    【解决方案2】:

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

    【讨论】:

    • 我不认为 MINUS 是在 RDFLIB 中实现的,但很好。
    • 是的,MINUS 是 1.1 功能,因此未在 rdflib 中实现。 (但这也是我来的明显解决方案)
    猜你喜欢
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多