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 没有结果。
假设三元组如下:
@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 没有结果。