我开始使用Jena Engine,我想我已经掌握了语义是什么。 然而,我很难理解在耶拿和ARQ中代表一堆三元组的不同方式:
Model
,文档说明了RDF图的Jenas名称。Graph
似乎是必要的工具,但是它似乎与Model
没有共享一个共同的接口,尽管可以得到Graph
Model
DataSet
,它似乎也是某种三元组的集合。当然,有些人在API中查看,我找到了以某种方式从一个转换为另一个的方法。但是我怀疑它有3个不同的界面可以做同样的事情。
所以,问题是:这三者之间的关键设计差异是什么?我什么时候应该使用哪一个?特别是:当我想要保持单个三元组但是将它们视为一大堆(联合)时,我应该使用哪些数据结构(以及为什么)?
另外,当我从一个“转换”到另一个时,我“松散”任何东西(例如,model.getGraph()
是否包含的信息少于model
)?
答案 0 :(得分:20)
Jena分为用于应用程序开发人员的API和用于系统开发人员的SPI,例如制作存储引擎,reasoners等人员。
DataSet
,Model
,Statement
,Resource
和Literal
是API接口,为应用程序开发人员提供了许多便利。
DataSetGraph
,Graph
,Triple
,Node
是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)
关于您丢失信息的问题,Model
和Graph
您没有(据我记得)。更有趣的案例是Resource
与Node
。 Resources
知道他们属于哪个模型,因此您可以(在api中)写resource.addProperty(...)
,最终成为Graph#add
。 Node
没有这样的便利,并且与特定的Graph
无关。因此Resource#asNode
是有损的。
最后:
当我想要持有三个三元组但是将它们视为一大堆(联合)时,我应该使用哪些数据结构(以及为什么)?
您显然是普通用户,因此您需要API。您想存储三元组,因此请使用Model
。现在您想要将模型作为一个联合查询:您可以:
Model#union()
所有内容,将所有三元组复制到新模型中。ModelFactory.createUnion()
所有内容,它将创建一个动态联合(即不复制)。unionDefaultGraph
选项。这些最后一个适用于大量模型和大型模型,但设置起来更为复杂。
答案 1 :(得分:15)
简短回答:Model
只是一个无状态包装器,在Graph
周围有很多方便的方法。 ModelFactory.createModelForGraph(Graph)
在模型中包装图表。 Model.getGraph()
获取包装图。
大多数应用程序员都会使用Model
。我个人更喜欢使用Graph
,因为它更简单。我无法记住Model
课上的所有残疾。
Dataset
是几个Model
的集合:一个“默认模型”和零个或多个“命名模型”。这对应于SPARQL中“RDF数据集”的概念。 (从技术上讲,SPARQL不是“RDF图”的查询语言,而是“RDF数据集”,它可以是命名的RDF图的集合加上默认图。)