Java 检索空白节点映射

Java 检索空白节点映射,java,sparql,jena,blank-nodes,Java,Sparql,Jena,Blank Nodes,我的小组目前正在开发一个点击式界面,用于导航和从RDF图中提取信息。作为其中的一部分,我们将使用Jena的sparqlservice方法连接到各种triple store端点。为了移动用户当前查看的点,用户可以选择一个节点并使其成为中心。然后,程序使用下面的表达式获取该节点的邻居: CONSTRUCT { <URI> ?p ?o . ?s ?p <URI> . } WHERE { {<URI> ?p ?o .} UNION {?s ?p <URI>

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

CONSTRUCT {
<URI> ?p ?o .
?s ?p <URI> .
} WHERE {
{<URI> ?p ?o .}
UNION
{?s ?p <URI> .}
} LIMIT N
我们面临的问题是关于空白节点。当Jena从端点获得一个空白节点时,会立即为其分配一个Jena bNode ID。该ID将与端点显示的ID不同,如果用户在客户端选择一个空白节点作为新中心,这显然会导致问题


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

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

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

<强>注释:< /强>空白节点标签<代码> i>代码>作用于结果集XML文档 并且不需要与该RDF的空白节点标签关联。 查询图中的术语

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

无论采用何种格式,您都会遇到一个问题,即某些语法对空白节点标签中可能出现的字符有很大的限制,因此即使存储使用了其内部标识符(这是罕见的),它通常也必须以某种方式对其进行转义/编码,以使其成为有效语法。然后,这要求您了解每个端点转义/编码方案(如果它公开了所有标识符)以及如何将其转换为实际ID

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

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

变通办法 解决方法是简单地扩展上一个查询,您的问题意味着用户只会因为上一个查询而看到这个空白节点。由于您只能通过关联标识空白节点,所以可以修改以前的查询,以询问关于空白节点的其他细节。
这可能会返回有关多个节点的详细信息,您必须进行一些客户端处理,以确定用户实际需要哪个节点,以及如何将附加数据与现有可视化关联,但这一切都是可行的。

在范围内扩展查询,然后在本地处理结果将更加昂贵,但应该是可行的。非常感谢您对RobV的全面发布。
Query myQuery = QueryFactory.create(_query);
QueryExecution qexe = QueryExecutionFactory.sparqlService(this.myURL, myQuery);
Model resultModel = qexe.execConstruct();
return resultModel;