如何用Sesame获得资源的简洁有界描述?

时间:2013-06-28 11:01:20

标签: sparql rdf semantic-web sesame blank-nodes

我一直在测试Sesame 2.7.2,当面对DESCRIBE查询不包含空白节点关闭的事实时,我感到非常惊讶[编辑:正确的术语是{{3}的CBD }

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

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

  1. 查询DESCRIBE <uri1>
  2. 迭代结果以确定哪些对象是空节点
  3. 然后DESCRIBE ?b WHERE { <uri1> pred_relating_to_bnode_ ?b }
  4. 只要找到bnodes就递归执行并链接
  5. 如果我没弄错的话,必须用

    来描述深度为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 .
    

1 个答案:

答案 0 :(得分: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""Daphne"的空白节点,这是一个开始。

Sesame中的较大问题

看起来你将不得不做上面描述的事情,可能还有多次搜索,或者你将不得不修改芝麻。编写一些有创意的SPARQL的替代方法是改变Sesame实现描述查询的方式。一些端点使这相对容易,但芝麻似乎不是其中之一。 2011年有一个邮件列表主题Custom SPARQL DESCRIBE Implementation,似乎解决了同样的问题。

RobertoGarcía问道:

  

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

     

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

Jeen Broekstra回复:

  

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

     

&GT;如果这是不可能的,任何有关如何使用CONSTRUCT实现它的建议   疑问?

     

我不确定在单个查询中执行此操作在技术上是否可行。   CBD本质上是递归的,而SPARQL确实有一些支持   对于递归(属性链),问题是你必须做一个   中间检查属性链的每一步,看看是否   绑定值是否为空节点。这不是SPARQL的东西   支持开箱即用:属性链定义为只有长度   作为停止条件的路径。

     

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

     

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

     

唯一的另一个选择是记录支持CBD的功能请求   芝麻。我不能保证是否/何时会遵循   尽管如此。