SPARQL中"FILTER NOT EXISTS"的机制

The mechanism of "FILTER NOT EXISTS" in SPARQL

假设三元组如下:

@prefix  :       <http://example/> .
@prefix  rdf:    <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix  foaf:   <http://xmlns.com/foaf/0.1/> .

:alice  rdf:type   foaf:Person .
:alice  foaf:name  "Alice" .
:bob    rdf:type   foaf:Person .  

然后我们基于 SPARQL 1.1 执行 3 个查询:

Q1:

SELECT ?s 
WHERE 
{
    ?s ?p ?o .
    FILTER NOT EXISTS { ?s foaf:name ?y }
} 

Q2:

SELECT ?s 
WHERE 
{
    ?s ?p ?o .
    FILTER NOT EXISTS { ?x foaf:name ?y }
} 

Q3:

SELECT ?s 
WHERE 
{
    ?s ?p ?o .
    FILTER NOT EXISTS { ?x foaf:mailbox ?y }
} 

这三个查询 return 三种不同的解决方案。谁能帮我弄清楚为什么 Q2 与 Q1 和 Q3 相比评估为无查询解决方案?非常感谢:)

Q2 returns 无解,因为在您的数据中,存在匹配 ?x foaf:name ?y 的语句:?x = :alice?y = "Alice"。您没有对 ?x?y 施加进一步的限制。因此,无论查询中的其他变量(?s?p?o)绑定到什么,NOT EXISTS 条件总是会失败,因此查询 returns 没有结果。