java - Jena/ARQ : Difference between Model, 图形和数据集

标签 java jena

我开始使用 Jena 引擎,我想我已经掌握了语义是什么。 但是,我很难理解在 Jena 和 ARQ 中表示一堆三元组的不同方式:

  • 您在开始时偶然发现的第一件事是 Model,并且文档说它是 RDF 图的 Jenas 名称。
  • 但是,当我想查询模型的联合时,还有 Graph 这似乎是必要的工具,但是它似乎与 Model 没有共享一个通用接口(interface)>,尽管可以从 Model
  • 中得到 Graph
  • 然后在 ARQ 中有 DataSet,它似乎也是某种三元组的集合。

当然,在查看了 API 之后,我找到了以某种方式从一种转换为另一种的方法。但是,我怀疑对于同一事物而言,它不仅仅是 3 个不同的接口(interface)。

那么,问题是:这三者之间的主要设计差异是什么?我什么时候应该使用哪一个?特别是:当我想保存单个三元组但将它们查询为一大堆(联合)时,我应该使用这些数据结构中的哪一个(以及为什么)? 另外,当从一个“转换”到另一个时,我是否会“丢失”任何东西(例如,model.getGraph() 在某种程度上是否包含比 model 更少的信息)?

最佳答案

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

DataSetModelStatementResourceLiteral是API接口(interface)并为应用程序开发人员提供许多便利。

DataSetGraphGraphTripleNode 是 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)

关于丢失信息的问题,ModelGraph 你没有(据我记得)。更有趣的情况是 ResourceNodeResources 知道它们属于哪个模型,因此您可以(在 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/

相关文章:

java - String 和 StringBuilder 的区别及其内部组织

java - 使用 JavaPoet 生成一个字段作为匿名类

rdf - 通过从 jena 中加载的本体中导入 namespace 来编写 RDF?

java - 使用 Jena 读取限制约束

Java - 奇怪的目录问题?

java - GWT RemoteServiceServlet Java 6

java - 如何配置 Maven cargo 下载部署 Wildfly 10 并添加测试用户?

mysql - 将 n-triple 文件加载到 Jena SDB 模型时,我遇到 java.lang.NullPointerException 问题

python - 如何通过获取所有类名称属性关系来创建领域本体词典并将其保存在列表中

java - Jena - 为什么 MinCardinalityRestriction 设置为 "1 Thing"?