我开始使用 Jena 引擎,我想我已经掌握了语义是什么。 但是,我很难理解在 Jena 和 ARQ 中表示一堆三元组的不同方式:
- 您在开始时偶然发现的第一件事是
Model
,并且文档说它是 RDF 图的 Jenas 名称。 - 但是,当我想查询模型的联合时,还有
Graph
这似乎是必要的工具,但是它似乎与Model
没有共享一个通用接口(interface)>,尽管可以从Model
中得到 - 然后在 ARQ 中有
DataSet
,它似乎也是某种三元组的集合。
Graph
当然,在查看了 API 之后,我找到了以某种方式从一种转换为另一种的方法。但是,我怀疑对于同一事物而言,它不仅仅是 3 个不同的接口(interface)。
那么,问题是:这三者之间的主要设计差异是什么?我什么时候应该使用哪一个?特别是:当我想保存单个三元组但将它们查询为一大堆(联合)时,我应该使用这些数据结构中的哪一个(以及为什么)?
另外,当从一个“转换”到另一个时,我是否会“丢失”任何东西(例如,model.getGraph()
在某种程度上是否包含比 model
更少的信息)?
最佳答案
Jena 分为用于应用程序开发人员的 API 和用于系统开发人员的 SPI,例如制作存储引擎、推理器等的人员。
DataSet
、Model
、Statement
、Resource
和Literal
是API接口(interface)并为应用程序开发人员提供许多便利。
DataSetGraph
、Graph
、Triple
、Node
是 SPI 接口(interface)。它们非常简洁且易于实现(如果您必须实现这些东西,您会希望如此)。
各种各样的 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
是有损的。
最后:
When I want to hold individual bunches of triples but query them as one big bunch (union), which of these datastructures should I use (and why)?
您显然是普通用户,因此您需要 API。你想存储三元组,所以使用 Model
。现在您想将模型作为一个联合进行查询:您可以:
Model#union()
一切,这会将所有三元组复制到一个新模型中。ModelFactory.createUnion()
一切,这将创建一个动态联合(即不复制)。- 将您的模型作为命名模型存储在 TDB 或 SDB 数据集存储中,并使用
unionDefaultGraph
选项。
最后一个最适合大量模型和大型模型,但设置起来有点复杂。
关于java - Jena/ARQ : Difference between Model, 图形和数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6981467/