sparql - 在 CONSTRUCT 中跨多个解决方案生成相同的空白节点

标签 sparql rdf blank-nodes

我曾多次遇到过想要在 CONSTRUCT 查询中使用空白节点的情况,但我需要为所有(或多个)查询解决方案获取相同的空白节点.

假设我们的数据集中有作者及其所写书籍的列表:

@prefix : <http://example.org#> .

:stephen_king a :Author ;
      :firstName "Stephen" ;
      :authorOf "The Shining", "Cujo".

:stephen_hawking a :Author ;
      :firstName "Stephen" ;
      :authorOf "A Brief History of Time" . 

:virginia_wolf a :Author ;
      :firstName "Virginia" ;
      :authorOf "Mrs Dalloway" . 

例如,假设我想将名字为 Stephen 的所有书籍作者绑定(bind)到一个空白节点:

PREFIX : <http://example.org#>
CONSTRUCT {
   [ :containsBook ?book ]
}
WHERE {
   ?book ^:authorOf/:firstName "Stephen" .
}

会返回类似的内容:

[ :containsBook "The Shining" ] .
[ :containsBook "A Brief History of Time" ] .
[ :containsBook "Cujo" ] .

但期望的结果是:

[ :containsBook "The Shining" ;
  :containsBook "A Brief History of Time" ;
  :containsBook "Cujo" ] .

关于如何实现这一目标有什么想法吗?

最佳答案

经过一段时间的思考,我想出了一些我认为是通用解决方案的方法。不过,我还没有在许多 SPARQL 实现上尝试过它,所以如果您发现它不适合您,请提供反馈。基本上,在意识到我们无法对 SPARQL 如何处理查询结果部分中的数据做任何事情之后,我们自然会开始考虑将空白节点绑定(bind)到变量。所以,假设我们尝试这样的事情:

PREFIX : <http://example.org#>
CONSTRUCT {
   ?bnode :containsBook ?book
}
WHERE {
   ?book :hasAuthor/:firstName "Stephen" .
   BIND(BNODE() AS ?bnode)
}

不,那也行不通。这是为什么?该查询评估整个查询,对于每个解决方案,BIND 函数将被再次调用,我们最终将得到不同的空白节点。

现在这就是窍门。将查询的 BIND 部分放置在一个组中。这样,由于 SPARQL 在变量作用域方面的工作方式,在评估查询之后,我们将最终得到一个连接,其中 ?bnode 部分本来就是仅调用一次:

PREFIX : <http://example.org#>
CONSTRUCT {
   ?bnode :containsBook ?book 
}
WHERE {
   ?book :hasAuthor/:firstName "Stephen" .
   { BIND(BNODE() AS ?bnode) }
}

希望有人像我一样发现这个有用。干杯。

关于sparql - 在 CONSTRUCT 中跨多个解决方案生成相同的空白节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46155991/

相关文章:

sparql - 删除rdf图数据

regex - SPARQL:组合和排除正则表达式过滤器

java - SPARQL 在 Java 中并发查询?

SPARQL错误尝试附加已使用变量的过滤器

mysql - 如何在mysql和php中使用dmoz的rdf数据?

java - 我无法删除耶拿中的数据类型属性值

html - 在 HTML 页面中使用引文本体

带有空白节点的 Sparql 查询可能很复杂

python - RDFLib 空白节点打印

python - 从 SPARQL 查询结果中排除空白节点