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

Max*_*Max 6 rdf sesame semantic-web sparql blank-nodes

我一直在测试Sesame 2.7.2,当遇到DESCRIBE查询不包含空白节点关闭的事实时,我有一个很大的惊喜[ 编辑:正确的术语是CBD,用于简洁有界的描述 ]

如果我正确理解,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 }
Run Code Online (Sandbox Code Playgroud)

除非有更简单的方法吗?

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

CONSTRUCT {<uri1> ?p ?o} WHERE {<uri1> ?p ?o}
Run Code Online (Sandbox Code Playgroud)

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

<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
Run Code Online (Sandbox Code Playgroud)

目前: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 .
Run Code Online (Sandbox Code Playgroud)

Jos*_*lor 4

使用 SPARQL 的部分解决方案

\n\n

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

\n\n
@prefix : <http://example.org/> .\n\n:Alice :named "Alice" ;\n       :likes :Bill, [ :named "Carl" ;\n                       :likes [ :named "Daphne" ]].\n:Bill :likes :Elaine ;\n      :named "Bill" .\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以运行查询:

\n\n
PREFIX : <http://example.org/>\n\ndescribe :Alice ?object where {\n  :Alice :likes* ?object .\n  FILTER( isBlank( ?object ) )\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

并得到结果:

\n\n
@prefix :        <http://example.org/> .\n\n:Alice\n      :likes        :Bill ;\n      :likes        [ :likes        [ :named        "Daphne"\n                                    ] ;\n                      :named        "Carl"\n                    ] ;\n      :named        "Alice" .\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

《芝麻》中更大的问题

\n\n

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

\n\n

罗伯托·加克\xc3\xada 询问:

\n\n
\n

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

\n\n

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

\n
\n\n

吉恩·布鲁克斯特拉 回复:

\n\n
\n

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

\n\n

> 如果这是不可能的,关于如何使用 CONSTRUCT \n 查询来实现它有什么建议吗?

\n\n

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

\n\n

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

\n\n

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

\n\n

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

\n
\n

  • @RobV 我正在这样做,当我的连接中断时:PI 打算今天早上将其归档,但我想我会在此之前检查...归档为 [SES-1876](https://openrdf.atlassian.net/browse/ SES-1876) (2认同)
  • FWIW,正在努力。没有承诺何时解决这个问题(除非你付给我很多现金;)) (2认同)