我开始使用Jena Engine,我想我已经了解了什么是语义。但是我很难理解在Jena和ARQ中代表一堆三元组的不同方式:
Model
Graph
DataSet
当然,在API中环顾四周后,我发现了以某种方式从一种转换为另一种的方法。但是我怀疑同一件事有3个以上的不同接口。
因此,问题是:这三个之间的主要设计区别是什么?我什么时候应该使用哪个?尤其是:当我想持有三串的单个束而将它们作为一个大束(联合)进行查询时,我应该使用这些数据结构中的哪一个(以及为什么)?另外,当从一个“转换”到另一个时,我是否“松散”了任何东西(例如,model.getGraph()包含的信息少于model)?
model.getGraph()
model
Jena分为面向应用程序开发人员的API和面向系统开发人员的SPI,例如开发存储引擎,推理程序的人员等。
DataSet,Model,Statement,Resource和Literal是API接口,并提供应用程序开发者带来很多便利。
Statement
Resource
Literal
DataSetGraph,Graph,Triple,Node是SPI接口。它们相当简单,易于实现(如您所愿,您必须实现这些东西)。
DataSetGraph
Triple
Node
各种各样的API操作都可以解决SPI调用。举一个例子,Model接口有四种不同的contains方法。在内部,每个结果都会导致一个呼叫:
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是有损的。
Resources
resource.addProperty(...)
Graph#add
Resource#asNode
最后:
当我想保存单个三元组而又将它们查询为一大束(联合)时,我应该使用哪些数据结构(以及为什么)?
您显然是普通用户,因此需要API。您想存储三元组,所以使用Model。现在,您希望将模型作为一个联合查询:您可以:
Model#union()
ModelFactory.createUnion()
unionDefaultGraph
这些中的最后一个最适合大量模型和大型模型,但是要涉及更多的设置工作。