Jena/ARQ:模型、图形和数据集之间的差异

2022-09-01 07:43:57

我开始使用耶拿引擎,我想我掌握了语义是什么。然而,我很难理解在耶拿和ARQ中表示一堆三元组的不同方法:

  • 启动时您偶然发现的第一件事是,文档上写着RDF图的Jenas名称。Model
  • 然而,当我想查询模型的并集时,似乎也是必要的工具,但是它似乎与 共享一个共同的接口,尽管人们可以从GraphModelGraphModel
  • 然后是ARQ,它似乎也是某种三元组的集合。DataSet

当然,在API中环顾四周后,我找到了以某种方式从一个转换到另一个的方法。但是,我怀疑它不仅仅是同一事物的3个不同接口。

所以,问题是:这三者之间的关键设计差异是什么?我应该什么时候使用哪一个?特别是:当我想持有单个三元组,但将它们查询为一个大束(联合)时,我应该使用哪些数据结构(以及为什么)?此外,当从一个“转换”到另一个时,我是否“松散”了任何东西(例如,以某种方式包含的信息比)少?model.getGraph()model


答案 1

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

DataSet、、 和 是 API 接口,为应用程序开发人员提供了许多便利。ModelStatementResourceLiteral

DataSetGraph、、、是 SPI 接口。它们非常简陋,易于实现(如果你必须实现这些东西,你会希望如此)。GraphTripleNode

各种各样的 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中)写哪个最终成为一个。 没有这样的便利,并且与特定的.因此是有损的。ModelGraphResourceNodeResourcesresource.addProperty(...)Graph#addNodeGraphResource#asNode

最后:

当我想持有单个三元组,但将它们查询为一个大束(联合)时,我应该使用哪些数据结构(以及为什么)?

你显然是一个普通用户,所以你想要API。您想要存储三元组,因此请使用 .现在,您希望将模型作为一个联合进行查询:您可以:Model

  • Model#union()一切,这会将所有三元组复制到新模型中。
  • ModelFactory.createUnion()一切,这将创建一个动态的联合(即没有复制)。
  • 将模型作为命名模型存储在 TDB 或 SDB 数据集存储中,然后使用该选项。unionDefaultGraph

其中最后一个最适合大量模型和大型模型,但设置起来有点复杂。


答案 2

简短的回答:只是一个无状态的包装器,在. 在模型中包装图形。 获取包装的图形。ModelGraphModelFactory.createModelForGraph(Graph)Model.getGraph()

大多数应用程序程序员会使用 .就个人而言,我更喜欢使用,因为它更简单。我很难记住课堂上的所有废话。ModelGraphModel

Dataset是几个 s 的集合:一个“默认模型”和零个或多个“命名模型”。这与SPARQL中“RDF数据集”的概念相对应。(从技术上讲,SPARQL不是“RDF图”的查询语言,而是“RDF数据集”的查询语言,它可以是命名RDF图和默认图的集合。Model


推荐