switch-statement - SPARQL BIND 破坏了值?

标签 switch-statement rdf sparql sesame rdflib

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

相关文章:

javascript:switch 语句中的常用命令

c# - 如何在不为每种情况使用 if 和 switch 语句的情况下重构链中的数百个条件?

drupal - 如何将 Opencalais 的 RDF 结果添加到 apache solr 中,以便在我的 Drupal 站点中获得更好的搜索结果?

java - 如何获得直辖市的国家/地区?

java - 投影中的变量 'x' 不存在于 GROUP BY 中

regex - AWK switch case 与 *.html 不匹配

c++ - 将用户输入验证为 int 时陷入无限循环

sparql - Virtuoso 中用户定义的 SPARQL 聚合函数

lisp - 比较 Common Lisp 中 AllegroGraph Prolog 中的 RDF 文字

sparql - 如何在 python 中使用 RDFlib 将 RDF 数据存储到 Fuseki SPARQL 端点中的三元组存储