繁体   English   中英

SPARQL / CONSTRUCT中的条件绑定

[英]Conditional Binding in SPARQL/CONSTRUCT

我有一个SPARQL CONSTRUCT的工作原理是这样的:

CONSTRUCT {
  ?uri rdfs:label ?label; 
       foo:has-value ?v.        
}
WHERE {
  ?uri 
     rdfs:label ?label; 
     foo:has-flag ?f.

  BIND ( IF ( ?f = 0, "Value for Zero", IF ( ?f = 1, "Value for One", '' ) ) AS ?v )
}

问题是,当?f既不是0也不是1(但仍然有一些值)时,我根本就不需要has-value语句。 使用上面的语法,我得到?uri has-value '' 如果我可以给?v分配某种“空”或避免绑定,那会起作用的,但是我在规范中找不到类似的东西。

有什么办法吗?

编辑Scott解决方案适用于基于图形的常见查询。 我来自的案例涉及VALUES的使用, 情况更为复杂 ,到目前为止我找不到解决方案。

EDIT / 2 :由Andy在Jena邮件列表中建议的错误触发解决方案 ,效果很好! 我发现更具可读性的另一种方法是,当我们想跳过原始值时, 绑定一个未绑定的变量

给定评论中的反馈,以下是基于OPTIONAL的解决方案,应满足所有条件:

CONSTRUCT {
  ?uri rdfs:label ?label; 
       foo:has-value ?v.        
}
WHERE {
  ?uri rdfs:label ?label .     
  ?uri foo:has-flag ?f.
  OPTIONAL { FILTER (?f = 0)
      BIND("Value for Zero" AS ?v)
  }
  OPTIONAL { FILTER (?f = 1)
      BIND("Value for One" AS ?v)
  }
}

如所指出的那样,该先前的解决方案将不覆盖有标签但?f不是0或1的情况:

CONSTRUCT {
  ?uri rdfs:label ?label; 
       foo:has-value ?v.        
}
WHERE {
  ?uri 
     rdfs:label ?label; 
     foo:has-flag ?f. 
  FILTER (?f = 0 || ?f = 1)
  BIND ( IF ( ?f = 0, "Value for Zero", IF ( ?f = 1, "Value for One", '' ) ) AS ?v )
}

有点古怪,但是应该创建一个空白节点,然后过滤掉这些节点:

CONSTRUCT {
  ?uri rdfs:label ?label; 
       foo:has-value ?v.        
}
WHERE {
  ?uri rdfs:label ?label .
  OPTIONAL { 
    ?uri foo:has-flag ?f.

    BIND ( IF ( ?f = 0, "Value for Zero", 
             IF ( ?f = 1, "Value for One", BNODE() ) 
         ) AS ?v )
    FILTER(!ISBLANK(?v))
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM