1

我的小组目前正在开发一个点击界面,用于从 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 不会和端点提供的 ID 相同,如果用户在客户端选择一个空白节点作为新的中心,这显然会引起问题。

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

4

1 回答 1

3

基本上不,当与远程 SPARQL 服务交谈时,您无法直接识别空白节点。

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

注意:空白节点标签I的范围是结果集 XML 文档,不需要与查询图中该 RDF 术语的空白节点标签有任何关联。

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

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

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

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

解决方法

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

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

于 2014-03-20T15:50:37.633 回答