如何使用Sesame获得资源的简明有界描述



我一直在测试Sesame 2.7.2,当我发现DESCRIBE查询不包括空白节点闭包时,我大吃一惊

如果我理解正确的话,SPARQL规范在这方面相当宽松,并表示返回的内容实际上取决于提供者,但我仍然对这个选择感到惊讶,因为bnode(在描述查询的结果中)不能在后续的SPARQL查询中使用。

所以问题是:我如何在不做的情况下获得资源<uri1>的封闭描述

  1. 查询DESCRIBE <uri1>
  2. 迭代结果以确定哪些对象是空白节点
  3. 则CCD_ 3
  4. 递归执行,并在找到bnode时进行链接

如果我没有错的话,depth-2bnode必须用来描述

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

除非有更简单的方法?

最后,让DESCRIBE返回一个资源的封闭描述,这样仍然可以通过下面的内容获得当前返回的结果,这不是更好、更简单吗?

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

编辑:这里是一个我想从Sesame 返回的封闭结果的例子

<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 .

使用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" .

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

《芝麻》中更大的问题

看起来你必须做上面描述的事情,可能需要多次搜索,或者你必须修改Sesame。编写一些有创意的SPARQL的另一种选择是改变Sesame实现描述查询的方式。有些端点使这相对容易,但Sesame似乎不是其中之一。2011年有一个邮件列表线程,Custom SPARQL DESCRIBE Implementation,似乎也解决了这个问题。

Roberto García问道:

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

我尝试使用CONSTRUCT查询来重现类似的行为但是性能不好,如果我尝试考虑指向空白节点的长属性链从所描述的资源开始。

Jeen Broekstra回复:

Sesame中DESCRIBE的实现是在查询中硬编码的解析器。它只能通过调整解析器本身来更改,甚至那么它将是棘手的,因为查询模型没有简单的方式来表达它要么:它需要代数的扩展。

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

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

也许使用以下复杂的组合是可能的子查询、联合和期权,但我对此表示怀疑。

我认为最好的解决方法是使用标准的DESCRIBESesame支持的格式,并且对于中的每个空白节点值结果进行单独的连续查询。换句话说:你可以通过手

唯一的其他选项是在中记录支持CBD的功能请求芝麻。我不能保证是否/何时会这样做尽管如此。

最新更新