【问题标题】:Produce the same blank node in CONSTRUCT across multiple solutions在 CONSTRUCT 中跨多个解决方案生成相同的空白节点
【发布时间】:2018-02-19 17:06:02
【问题描述】:

我遇到过几次想在 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 的书籍作者绑定到一个空白节点:

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 查询永远无法匹配数据...您的三元组仅从作者指向书籍,但您的查询从书籍开始搜索三元组
  • 该查询可以工作:select * WHERE { ?book ^:authorOf/:firstName "Stephen" . BIND(BNODE() AS ?bnode) },即属性路径不同
  • 谢谢。我错过了 inverse 属性的^,查询已相应更新。

标签: sparql rdf blank-nodes


【解决方案1】:

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

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

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

现在这是诀窍。将查询的BIND 部分放在一个组中。这样,由于 SPARQL 在变量作用域方面的工作方式,我们将在查询被评估后得到一个连接 ,其中 ?bnode 部分将只被调用一次: p>

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

希望有人和我一样觉得这很有用。干杯。

【讨论】:

  • 为什么它与大括号 { } 一起使用是因为它表示基本图形模式,对于空白节点,以下成立:“当使用 _:abc 形式的空白节点时,标签空白节点的范围仅限于基本图形模式。"
  • 因此,BIND 在单独的 BGP 中执行一次,因此,您有一个空白节点,然后将其与外部 BGB 连接。
  • 或者把BIND放在前面:WHERE { BIND(BNODE() AS ?bnode) ?book :hasAuthor/:firstName "Stephen" . }。使用 BIND,顺序确实很重要 - 它与之前的内容绑定。
  • 我不认为顺序对BIND 很重要。查询的执行顺序是严格的,还是查询优化算法会搞砸? (即优化器是否允许弄乱订单?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-19
  • 2020-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多