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

时间:2011-08-08 11:32:08

标签: java jena

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

  • 启动时遇到的第一件事是Model,文档说明了RDF图的Jenas名称。
  • 然而,当我想查询模型联合时,还有Graph似乎是必要的工具,但是它似乎与Model没有共享一个共同的接口,尽管可以得到Graph
  • 中的Model
  • 然后在ARQ中有DataSet,它似乎也是某种三元组的集合。

当然,有些人在API中查看,我找到了以某种方式从一个转换为另一个的方法。但是我怀疑它有3个不同的界面可以做同样的事情。

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

2 个答案:

答案 0 :(得分:20)

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

DataSetModelStatementResourceLiteral是API接口,为应用程序开发人员提供了许多便利。

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

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

Graph#contains(Node, Node, Node)

,例如

graph.contains(nodeS, nodeP, nodeO); // model.contains(s, p, o) or model.contains(statement)
graph.contains(nodeS, nodeP, Node.ANY); // model.contains(s, p)

关于您丢失信息的问题,ModelGraph您没有(据我记得)。更有趣的案例是ResourceNodeResources知道他们属于哪个模型,因此您可以(在api中)写resource.addProperty(...),最终成为Graph#addNode没有这样的便利,并且与特定的Graph无关。因此Resource#asNode是有损的。

最后:

  

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

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

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

这些最后一个适用于大量模型和大型模型,但设置起来更为复杂。

答案 1 :(得分:15)

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

大多数应用程序员都会使用Model。我个人更喜欢使用Graph,因为它更简单。我无法记住Model课上的所有残疾。

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