6

我一直在测试Sesame 2.7.2 ,当面对DESCRIBE查询不包括空白节点关闭这一事实时,我感到非常惊讶

如果我正确理解,SPARQL 规范对此非常宽松,并说返回的内容实际上取决于提供者,但我仍然对选择感到惊讶,因为不能使用 bnodes(在 describe 查询的结果中)在随后的 SPARQL 查询中。

所以问题是:我怎样才能在<uri1>不这样做的情况下获得对资源的封闭描述:

  1. 询问DESCRIBE <uri1>
  2. 遍历结果以确定哪些对象是空白节点
  3. 然后DESCRIBE ?b WHERE { <uri1> pred_relating_to_bnode_ ?b }
  4. 只要找到 bnode,就递归执行并链接

如果我没记错的话,深度 2 bnodes 必须用

DESCRIBE ?b2 WHERE {<uri1> <p1&> ?b . ?b <p2> ?b2 }

除非有更简单的方法可以做到这一点?

最后,让DESCRIBE返回一个资源的封闭描述不是更好更简单,您仍然可以获得当前返回的结果,如下所示?

CONSTRUCT {<uri1> ?p ?o} WHERE {<uri1> ?p ?o}

编辑:这是一个我想从芝麻回来的封闭结果的例子

<urn:sites#1> a my:WebSite .
<urn:sites#1> my:domainName _:autos1 .
<urn:sites#1> my:online "true"^^xsd:boolean .
_:autos1 a rdf:Alt .
_:autos1 rdf:_1 _:autos2
_:autos2 my:url "192.168.2.111:15001"@fr
_:autos2 my:url "192.168.2.111:15002"@en

目前:DESCRIBE <urn:sites#1>返回与查询相同的结果CONSTRUCT WHERE {<urn:sites#1> ?p ?o},所以我只得到那个

<urn:sites#1> a my:WebSite .
<urn:sites#1> my:domainName _:autos1 .
<urn:sites#1> my:online "true"^^xsd:boolean .
4

1 回答 1

4

使用 SPARQL 的部分解决方案

根据您的评论,这还不是一个确切的解决方案,但请注意,您可以在给定describe查询中描述多个事物。例如,给定数据:

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

:Alice :named "Alice" ;
       :likes :Bill, [ :named "Carl" ;
                       :likes [ :named "Daphne" ]].
:Bill :likes :Elaine ;
      :named "Bill" .

您可以运行查询:

PREFIX : <http://example.org/>

describe :Alice ?object where {
  :Alice :likes* ?object .
  FILTER( isBlank( ?object ) )
}

并得到结果:

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

:Alice
      :likes        :Bill ;
      :likes        [ :likes        [ :named        "Daphne"
                                    ] ;
                      :named        "Carl"
                    ] ;
      :named        "Alice" .

这当然不是一个完整的描述,因为它只是:likes:Alice,而不是任意谓词。但它确实"Carl"得到了名为and的空白节点"Daphne",这是一个开始。

芝麻中更大的问题

看起来您将不得不执行上述操作,并且可能需要进行多次搜索,或者您将不得不修改 Sesame。编写一些创造性的 SPARQL 的替代方法是改变 Sesame 实现描述查询的方式。一些端点使这相对容易,但 Sesame 似乎不是其中之一。2011 年有一个邮件列表线程Custom SPARQL DESCRIBE Implementation,似乎解决了同样的问题。

罗伯托·加西亚问:

我正在尝试自定义 SPARQL DESCRIBE 查询的行为。我愿意得到类似于 CBD 的东西(即所描述资源的所有属性和值加上连接到它的空白节点的所有属性和值)。

我尝试使用 CONSTRUCT 查询重现类似的行为,但是如果我尝试考虑从所描述的资源开始指向空白节点的长属性链,则性能不佳并且查询变得非常复杂。

Jeen Broekstra 回复:

Sesame 中 DESCRIBE 的实现在查询解析器中是硬编码的。它只能通过调整解析器本身来改变,即使这样也会很棘手,因为查询模型也没有简单的方法来表达它:它需要代数的扩展。

> 如果这是不可能的,关于如何使用 CONSTRUCT 查询来实现它的任何建议?

我不确定在技术上是否可以在单个查询中执行此操作。CBD 本质上是递归的,虽然 SPARQL 确实支持递归(属性链),但问题是您必须在属性链的每个步骤中进行中间检查,以查看绑定值是否为空白节点. 这不是 SPARQL 开箱即用的支持:属性链被定义为只有路径长度作为停止条件。

也许使用子查询、联合和可选的复杂组合可以实现某些事情,但我对此表示怀疑。

我认为最好的解决方法是使用 Sesame 支持的标准 DESCRIBE 格式,并为该结果中的每个空白节点值执行单独的连续查询。换句话说:你手动解决它。

唯一的其他选择是在 Sesame 中记录支持 CBD 的功能请求。不过,我无法保证是否/何时会跟进。

于 2013-06-28T15:06:33.083 回答