SPARQL代数:如果任何三元组不存在,则从命名图中询问

SPARQL代数:如果任何三元组不存在,则从命名图中询问,sparql,semantic-web,linked-data,triples,named-graphs,Sparql,Semantic Web,Linked Data,Triples,Named Graphs,以这两个命名图为例: # graph :yesterday :Foo :likes :Bar ; :likes :Qux . # graph :today :Foo :likes :Bar ; :likes :Baz . 现在,假设您想找出graph:Dayed中的三元组中是否有一个不在graph:today中。您将如何询问此查询 ASK FROM NAMED :yesterday FROM NAMED :today { GRAPH :yeste

以这两个命名图为例:

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

# graph :today
:Foo
    :likes :Bar ;
    :likes :Baz .
现在,假设您想找出graph
:Dayed
中的三元组中是否有一个不在graph
:today
中。您将如何询问此查询

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

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

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

前缀:
选择*{
图表:昨天{s?p?o}
筛选器不存在{图:今天{s?p?o}
}
减号
执行两个模式(左侧和右侧),然后返回左侧没有匹配行的行。这是一种反加入

前缀:
选择*{
图表:昨天{s?p?o}
负{图:今天{s?p?o}
}
对于这两种情况,我得到:

------------------------
| s    | p      | o    |
========================
| :Foo | :likes | :Qux |
------------------------
触发器:

@前缀:。
:昨天{
:Foo
:喜欢:酒吧;
字体喜欢:Qux。
}
:今天{
:Foo
:喜欢:酒吧;
:喜欢:Baz。
}

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

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

前缀:
选择*{
图表:昨天{s?p?o}
筛选器不存在{图:今天{s?p?o}
}
减号
执行两个模式(左侧和右侧),然后返回左侧没有匹配行的行。这是一种反加入

前缀:
选择*{
图表:昨天{s?p?o}
负{图:今天{s?p?o}
}
对于这两种情况,我得到:

------------------------
| s    | p      | o    |
========================
| :Foo | :likes | :Qux |
------------------------
触发器:

@前缀:。
:昨天{
:Foo
:喜欢:酒吧;
字体喜欢:Qux。
}
:今天{
:Foo
:喜欢:酒吧;
:喜欢:Baz。
}

当我试图弄清楚为什么我的过滤器不存在块没有过滤掉时,我现在觉得有点愚蠢,因为我忘记了正确命名的图形
:Bar
。感谢您抽出时间来回答,我希望其他人在将来会发现这一点有用。当我试图找出我的过滤器不存在的原因时,忘记了正确命名的图形,现在感觉有点愚蠢。
:Bar
。无论如何,谢谢你花时间回答,我希望其他人在将来会觉得这很有用。