【问题标题】:Retrieving blank node mapping检索空白节点映射
【发布时间】:2014-03-20 14:54:42
【问题描述】:

我的小组目前正在开发一个点击界面,用于导航和从 RDF 图中提取信息。作为其中的一部分,我们使用 Jena 的 sparqlservice 方法连接到各种三重存储端点。为了移动用户当前正在查看的点,用户可以选择一个节点并将其作为中心。然后程序使用下面的表达式获取该节点的邻居:

CONSTRUCT {
<URI> ?p ?o .
?s ?p <URI> .
} WHERE {
{<URI> ?p ?o .}
UNION
{?s ?p <URI> .}
} LIMIT N

URI 是用户选择的节点(我们对文字做了一些稍微不同的事情)。这个表达式然后执行如下:

Query myQuery = QueryFactory.create(_query);
QueryExecution qexe = QueryExecutionFactory.sparqlService(this.myURL, myQuery);
Model resultModel = qexe.execConstruct();
return resultModel;

我们面临的问题是关于空白节点。当 Jena 从端点获得一个空白节点时,它会立即被分配一个 Jena bNode ID。这个ID不会和endpoint提供的ID一样,如果用户在客户端选择一个空白节点作为新的中心,这显然会引起问题。

因此,我的问题是:有没有办法在 Jena 中保留原始端点 ID?通过浏览 Jena 的腹部,我可以看到几个 ResultSet 类使用一个类来处理端点 ID 和 Jena ID 之间的映射,称为 LabelToNodeMap。有没有办法检索这个映射?或者,阻止 Jena 使用自己的 ID 架构,而是使用端点。

【问题讨论】:

    标签: java sparql jena blank-nodes


    【解决方案1】:

    基本上,在与远程 SPARQL 服务通信时,您无法直接识别空白节点。

    首先,各种 SPARQL 结果规范实际上并不要求存储将其内部 ID 作为空白节点 ID 发送。例如SPARQL Results XML 规范有这样的说法:

    注意: 空白节点标签 I 的作用域是结果集 XML 文档 并且不需要与该 RDF 的空白节点标签有任何关联 查询图中的词条。

    即使使用CONSTRUCT 查询,情况也相似,几乎所有RDF 格式都表示空白节点标签仅作用于文档。因此,如果我在两个单独的请求中有_:id_:id,从语义上讲,我有两个不同的空白节点。

    无论格式如何,您还会遇到一些问题,即某些语法对空白节点标签中可以出现的字符非常严格,因此即使商店确实使用其内部标识符(这很少见),它通常也必须转义/以某种方式将它们编码为有效的语法。这需要您了解每个端点转义/编码方案(如果它完全公开标识符)以及如何将其转换为实际 ID。

    底线是端点并没有给你它的内部标识符,所以让 Jena 保留它们(严格来说这是可能的,但不是一个简单的扩展点)不会真正帮助你。

    即使您可以保留它们,也无法将它们发送回远程端点,因为查询中的空白节点是匿名变量而不是标识符。一些商店将接受非标准语法 &lt;_:id&gt; 来引用空白节点,但许多商店不会接受,而且您超出了 SPARQL 规范,因此您的应用程序失去了可移植性。

    解决方法

    解决方法是简单地扩展您之前的查询,您的问题暗示用户只看到这个空白节点是因为之前的查询。由于您只能通过关联来识别空白节点,因此您可以修改之前的查询以询问有关空白节点的更多详细信息。

    这可能会返回有关多个节点的详细信息,您必须进行一些客户端处理以确定用户真正想要的节点以及如何将附加数据与您现有的可视化相关联,但这都是可行的。

    【讨论】:

    • 在范围内扩展查询然后在本地处理结果会更昂贵,但应该是可行的。非常感谢您对 RobV 的详尽帖子。
    猜你喜欢
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多