Jena分为API,用于应用程序开发人员,SPI用于系统开发人员,例如制作存储引擎的人,推理器等。
DataSet
、、 和 是 API 接口,为应用程序开发人员提供了许多便利。Model
Statement
Resource
Literal
DataSetGraph
、、、是 SPI 接口。它们非常简陋,易于实现(如果你必须实现这些东西,你会希望如此)。Graph
Triple
Node
各种各样的 API 操作都可解析为 SPI 调用。举个例子,模型
接口有四种不同的方法。在内部,每个都会导致调用: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)
关于你关于丢失信息的问题,有和你没有(据我所知)。更有趣的情况是 vs. 知道它们属于哪个模型,所以你可以(在api中)写哪个最终成为一个。 没有这样的便利,并且与特定的.因此是有损的。Model
Graph
Resource
Node
Resources
resource.addProperty(...)
Graph#add
Node
Graph
Resource#asNode
最后:
当我想持有单个三元组,但将它们查询为一个大束(联合)时,我应该使用哪些数据结构(以及为什么)?
你显然是一个普通用户,所以你想要API。您想要存储三元组,因此请使用 .现在,您希望将模型作为一个联合进行查询:您可以:Model
-
Model#union()
一切,这会将所有三元组复制到新模型中。
-
ModelFactory.createUnion()
一切,这将创建一个动态的联合(即没有复制)。
- 将模型作为命名模型存储在 TDB 或 SDB 数据集存储中,然后使用该选项。
unionDefaultGraph
其中最后一个最适合大量模型和大型模型,但设置起来有点复杂。