SPARQL中“FILTER NOT EXISTS”的机制

Jia*_* Wu 4 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 .  
Run Code Online (Sandbox Code Playgroud)

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

问题一:

SELECT ?s 
WHERE 
{
    ?s ?p ?o .
    FILTER NOT EXISTS { ?s foaf:name ?y }
} 
Run Code Online (Sandbox Code Playgroud)

问题2:

SELECT ?s 
WHERE 
{
    ?s ?p ?o .
    FILTER NOT EXISTS { ?x foaf:name ?y }
} 
Run Code Online (Sandbox Code Playgroud)

Q3:

SELECT ?s 
WHERE 
{
    ?s ?p ?o .
    FILTER NOT EXISTS { ?x foaf:mailbox ?y }
} 
Run Code Online (Sandbox Code Playgroud)

这三个查询返回三个不同的解决方案。谁能帮我弄清楚为什么 Q2 的计算结果与 Q1 和 Q3 相比没有查询解决方案?提前谢谢了 :)

Jee*_*tra 6

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