我最近在许多 SPARQL 查询中使用了 VALUES,却发现在其中一个查询中我没有得到我所期望的结果。
这是一个简单的案例:
@prefix ns: <http://some/ns> .
<http://some/uri> a ns:Document ;
ns:A5000 "00003381" ;
ns:A5080 "sredniowiecze" .
我正在使用 VALUES 将 nsA5080 文字“转换”为 URI。简单查询:
PREFIX ns: <http://some/ns>
SELECT ?document ?u ?p ?lp
WHERE
{
?document ns:A5080 ?p .
VALUES (?p ?u) {
( "sredniowiecze" ns:MiddleAges )
( "other" ns:Other )
}
}
按预期工作:
Document U P LP
<http://some/uri> <http://some/nsMiddleAges> "sredniowiecze"
但是如果我将其更改为:
SELECT ?document ?u ?p ?lp
WHERE
{
?document ns:A5080 ?p .
BIND ( LCASE(?p) AS ?lp )
VALUES (?lp ?u) {
( "sredniowiecze" ns:MiddleAges )
( "other" ns:Other )
}
}
我得到:
Document U P Lp
<http://some/uri> <http://some/nsMiddleAges> "sredniowiecze" "sredniowiecze"
<http://some/uri> <http://some/nsOther> "sredniowiecze" "sredniowiecze"
这对我来说没有任何意义。额外的元组从哪里来?在真正的查询中我有大约。 VALUES 中有 30 多个元组,它们都出现在结果中。 更有趣的是,看起来几乎像这样的查询 - 在其他地方都可以正常工作。
想法?
最佳答案
我认为问题在于您同时使用 VALUES 和 BIND 来定义 ?lp 。我怀疑没有人想到会发生这种情况,但无论如何,由于 VALUES 最后设置,因此它在 BGP 中应该具有优先级,但是当 BIND 关闭 BGP 时,结果会很奇怪。我怀疑像这样的查询如果不对同一变量使用 BIND 和 VALUES ,效果会更好。
SELECT ?document ?u ?p ?lp
WHERE
{
?document ns:A5080 ?p .
VALUES (?lp ?u) {
( "sredniowiecze" ns:MiddleAges )
( "other" ns:Other )
FILTER (sameTerm(LCASE(?p), ?lp))
}
}
关于switch-statement - SPARQL BIND 破坏了值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24478329/