我开始使用耶拿引擎,我想我掌握了什么是语义。然而,我很难理解在Jena和ARQ中表示一组三元组的不同方法:
启动时遇到的第一件事是graphs.
Model
Graph,这似乎是我想要查询模型联盟时必需的工具,但是它似乎没有与Model共享一个公共接口,尽管可以从Model
Graph --在ARQ中有DataSet,这似乎也是某种类型的三元组的集合。当然,在一些人浏览了API之后,我找到了从一个转换到另一个的方法。不过,我怀疑,对于同一件事,它有不止3种不同的接口。
那么,问题是:这三者之间的主要设计差异是什么?我什么时候该用哪一个?特别是:当我想要持有单个的三组数据,但将它们作为一大串(联合)查询时,我应该使用哪些数据结构(以及为什么)?此外,当“转换”为另一个时,我是否“松”了任何东西(例如,model.getGraph()在某种程度上比model包含更少的信息)?
发布于 2011-08-08 13:38:36
Jena分为用于应用程序开发人员的API和用于系统开发人员的SPI,如制作存储引擎、推理器等。
DataSet、Model、Statement、Resource和Literal是API接口,为应用程序开发人员提供了许多便利。
DataSetGraph、Graph、Triple、Node是SPI接口。它们很简朴,实现起来也很简单(如果你想要实现这些东西的话,你会希望如此)。
各种各样的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中)编写最终成为Graph#add的resource.addProperty(...)。Node没有这样的方便,并且不与特定的Graph相关联。因此,Resource#asNode是有损的。
最后:
当我想要持有单个的三组数据,但将它们作为一大串(联合)查询时,我应该使用哪些数据结构(以及为什么)?
显然,您是一个正常的用户,所以您需要API。您想要存储三元组,所以使用Model。现在,您希望将模型查询为一个联合:您可以:
Model#union() everything,它将将所有三元组复制到一个新的model.ModelFactory.createUnion() everything中,这将创建一个动态联合(即,在TDB或SDB数据集存储中不使用copying).unionDefaultGraph选项.)。
最后一种方法最适合于大量的模型和大型模型,但需要更多地进行设置。
发布于 2011-08-08 14:13:19
简短的回答:Model只是一个无状态包装器,围绕一个Graph有很多方便的方法。ModelFactory.createModelForGraph(Graph)将图形包装在模型中。Model.getGraph()获取包装图。
大多数应用程序程序员都会使用Model。就我个人而言,我更喜欢使用Graph,因为它更简单。我很难记住Model类的所有技巧。
Dataset是几个Model的集合:一个“默认模型”和零个或多个“命名模型”。这相当于SPARQL中的“RDF数据集”的概念。(从技术上讲,SPARQL不是“RDF图”的查询语言,而是“RDF数据集”的查询语言,RDF数据集可以是命名RDF图的集合加上默认的图。)
https://stackoverflow.com/questions/6981467
复制相似问题