【问题标题】:SPARQL algebra: tricky ASK from named graphs if any triples do not existSPARQL 代数:如果不存在任何三元组,则从命名图中进行棘手的 ASK
【发布时间】:2015-11-15 09:34:57
【问题描述】:

取这两个命名图:

# graph :yesterday
:Foo 
     :likes :Bar ;
     :likes :Qux .

# graph :today
:Foo
    :likes :Bar ;
    :likes :Baz .

现在假设您想找出图 :yesterday 中的任何三元组是否在图 :today 中不存在。你会怎么ASK这个查询?

ASK
FROM NAMED :yesterday
FROM NAMED :today
{
    GRAPH :yesterday {
        ?s ?p ?o .
        ...
    }
}

【问题讨论】:

    标签: sparql semantic-web linked-data triples named-graphs


    【解决方案1】:

    SPARQL 有两种求反操作:使用您认为最自然的一种。当我阅读问题描述时,它对我来说更像是下面的第一个,但在这种问题情况下,它们非常相似。当模式的一部分或另一部分不匹配或没有共同变量时,它们的效果会有所不同。

    NOT EXISTS 测试是否存在模式(也有EXISTS)。它是应用于第一个模式的每个解决方案的过滤器。它就像一个嵌套的ASK,其中的变量也被替换为过滤器的传入变量。

    PREFIX : <http://example/>
    SELECT * {
      GRAPH :yesterday { ?s ?p ?o }
      FILTER NOT EXISTS { GRAPH :today { ?s ?p ?o } }
    }
    

    MINUS 执行两个模式(左侧和右侧),然后返回左侧的行,其中右侧的任何地方都没有匹配的行。这是一个反连接。

    PREFIX : <http://example/>
    SELECT * {
      GRAPH :yesterday { ?s ?p ?o }
      MINUS { GRAPH :today { ?s ?p ?o } }
    }
    

    我得到:

    ------------------------
    | s    | p      | o    |
    ========================
    | :Foo | :likes | :Qux |
    ------------------------
    

    TriG:

    @prefix : <http://example/> .
    
    :yesterday {
      :Foo 
         :likes :Bar ;
         :likes :Qux .
    }
    
    :today {
      :Foo
        :likes :Bar ;
        :likes :Baz .
    }
    

    【讨论】:

    • 当我拉出头发试图弄清楚为什么我的过滤器不存在块没有过滤掉:Bar 时,忘记了正确的命名图现在感觉有点愚蠢。无论如何,感谢您抽出宝贵的时间来回答,我希望其他人将来会觉得这很有用。
    猜你喜欢
    • 2018-03-08
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多