【问题标题】:SPARQL BIND breaks VALUES?SPARQL BIND 打破了价值?
【发布时间】:2014-06-29 17:05:44
【问题描述】:

我最近在许多 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"

这对我没有任何意义。额外的元组从何而来?在真正的查询中,我有 ca。 VALUES 中有 30 多个元组,它们都落在结果中。 还有什么更有趣的查询,看起来几乎像那个查询 - 在其他任何地方都可以正常工作。

想法?

【问题讨论】:

  • 我仍然有兴趣解决这个难题,但同时我想报告在我的原始查询中添加和删除 BIND 和变量周围的一些空格 - 修复了它。但是在上面的查询中执行非常相同的格式 - 不起作用。 :(
  • 如果这是一个错误,它可能是特定于某些特定实现的。您使用的是什么 SPARQL 引擎?耶拿?大师?别的东西?为什么这个标签是switch-statement?据我所知,它与 switch 没有任何关系。
  • 第二个查询不是你正在运行的。您显示的输出有一个 Document 变量,但您的第二个查询有 DocumentA。我不确定这是否会有所不同,但这使得重现这一点变得更加困难……
  • 我无法重现这个。请参阅pastebin.com/JK3AG3DN 了解我的尝试。 (我将第二个查询“固定”为 ?document 而不是 ?documentA,我认为它应该是。)
  • 我对 Sesame 和 Python 的 rdflib 有这个问题。两者产生相同的结果。我将它标记为 switch 语句,因为实际上我使用 VALUES 作为 switch/case。正如我上面所说 - 在我的原始查询中,我添加并删除了一些空格,它开始按预期工作。在这个例子中做同样的事情没有帮助。我也修复了问题中的第二个查询。感谢您指出这一点。

标签: switch-statement rdf sparql sesame rdflib


【解决方案1】:

我认为问题在于您同时使用 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))
    }    
}

【讨论】:

  • 我喜欢那个解决方案,但看起来我误解了 VALUES 的工作原理。我期待它找到匹配一个(或多个 - 如果已定义)变量的元组。就我而言,它是 ?lp。有趣的是,它对 ca 的工作方式是这样的。我创建的 30 个查询中有 29 个都遵循这种模式,但数据不同。幸运的是,您的解决方案只是我的代码中的一个小改动。谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多