检索空白节点映射

时间:2014-03-20 14:54:43

标签: java sparql jena blank-nodes

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

我的问题是:是否有某种方法可以在耶拿内保留原始端点ID?通过浏览Jena的腹部,我可以看到几个ResultSet类使用一个类来处理endpoint-和Jena ID之间的映射,称为LabelToNodeMap。有没有办法检索这个映射?或者,防止Jena使用自己的ID模式,而是使用端点。

1 个答案:

答案 0 :(得分:3)

实际上,在与远程SPARQL服务交谈时,您无法直接识别空白节点。

首先,各种SPARQL结果规范实际上并未要求商店将其内部ID作为空白节点ID发送。例如,SPARQL Results XML规范可以这样说:

  

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

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

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

底线是端点无论如何都没有给你内部标识符,所以让Jena保留它们(严格说来虽然不是一个简单的扩展点)但不会真的很帮助你。

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

解决方法

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

这可能会返回有关多个节点的详细信息,您必须进行一些客户端处理,以确定用户实际需要的节点以及如何将其他数据与现有可视化相关联,但这一切都是可行的。 / p>