Jena/ARQ:模型,图形和数据集之间的差异

Dro*_*ggl 26 java jena

我开始使用Jena Engine,我想我已经掌握了语义是什么.然而,我很难理解在Jena和ARQ中代表一堆三元组的不同方法:

  • 你在开始时偶然发现的第一件事就是Model文档说出了RDF图的Jenas名称.
  • 然而,Graph当我想查询模型联合时,似乎也是必要的工具,但是它似乎没有共享一个共同的接口Model,尽管可以得到Graph一个Model
  • 然后是DataSetARQ,它似乎也是某种三元组的集合.

当然,有些人在API中查找,我找到了以某种方式从一个转换为另一个的方法.但是我怀疑它还有3个不同的接口用于相同的事情.

所以,问题是:这三者之间的关键设计差异是什么?我什么时候应该使用哪一个?特别是:当我想要保持单个三元组但是将它们视为一大堆(联合)时,我应该使用哪些数据结构(以及为什么)?另外,当从一个"转换"到另一个时,我"松散"任何东西(例如,确实model.getGraph()包含的信息少于某些方式model)?

use*_*512 20

Jena分为用于应用程序开发人员的API和用于系统开发人员的SPI,例如制作存储引擎,reasoners等的人员.

DataSet,Model,Statement,ResourceLiteral是API接口,并为应用开发者提供了许多便利.

DataSetGraph,Graph,Triple,Node是SPI接口.它们非常简洁,易于实现(如果你必须实现这些东西,你希望如此).

各种各样的API操作都可以解析为SPI调用.举一个例子,Model界面有四种不同的contains方法.每个内部都会产生一个电话:

Graph#contains(Node, Node, Node)
Run Code Online (Sandbox Code Playgroud)

graph.contains(nodeS, nodeP, nodeO); // model.contains(s, p, o) or model.contains(statement)
graph.contains(nodeS, nodeP, Node.ANY); // model.contains(s, p)
Run Code Online (Sandbox Code Playgroud)

关于你丢失信息的问题Model,Graph你和你没有(据我记得).更有趣的例子是ResourceNode.Resources知道他们属于哪个模型,所以你可以(在api中)写出最终resource.addProperty(...)成为的模型Graph#add.Node没有这样的便利,也没有特定的Graph.因此Resource#asNode是有损的.

最后:

当我想要保持单个三元组但是将它们视为一大堆(联合)时,我应该使用哪些数据结构(以及为什么)?

您显然是普通用户,因此您需要API.你想存储三元组,所以使用Model.现在您想要将模型作为一个联合查询:您可以:

  • Model#union() 一切,将所有三元组复制到一个新的模型.
  • ModelFactory.createUnion() 一切,这将创建一个动态联合(即没有复制).
  • 将模型作为命名模型存储在TDB或SDB数据集存储中,并使用该unionDefaultGraph选项.

最后一个最适用于大量模型和大型模型,但设置起来要多一点.


cyg*_*gri 15

简短的回答:Model只是一个无状态的包装器,周围有很多方便的方法Graph.ModelFactory.createModelForGraph(Graph)在模型中包装图形.Model.getGraph()获取包装图.

大多数应用程序员都会使用Model.我个人更喜欢使用,Graph因为它更简单.我很难记住Model课堂上的所有琐事.

Dataset是几个Models 的集合:一个"默认模型"和零个或多个"命名模型".这对应于SPARQL中"RDF数据集"的概念.(从技术上讲,SPARQL不是"RDF图"的查询语言,而是"RDF数据集",它可以是命名的RDF图的集合加上默认图.)