Jena - 如何知道特定资源是否在模型中?

时间:2013-03-13 13:36:34

标签: resources jena

我试图发现我是否在模型中有特定的资源。为此,我正在使用:

model.getResource("example")

检查doc,此方法的行为与createResource完全相同。然后,即使它不在模型中,我也会得到一个新的资源。

如何检查我是否有资源避免创建它?

提前致谢!

2 个答案:

答案 0 :(得分:12)

在Jena中,Resource个对象本身不是 in 模型。该模型仅包含三元组 - Statement对象,其中包含主语,谓词和对象(通常缩写为SPO)。 S,P或O中的任何一个都可以是资源(注意Property是耶拿和RDF标准中Resource的子类型。因此,您需要将问题从“此模型是否包含此资源”改进为:

  • 模型M是否包含资源R作为主题?

  • 模型M是否包含资源R作为主语,谓词或对象?

这可以通过以下方式实现:

Resource r = ... ;
Model m = ... ;

// does m contain r as a subject?
if (m.contains( r, null, (RDFNode) null )) {
  ..
}

// does m contain r as s, p or o?
if (m.containsResource( r )) {
  ..
}

顺便说一句,在您的代码示例中,您有

model.getResource("example")

这将返回与给定URI对应的Resource对象,但不会对模型中的三元组产生副作用。这就是Model同时具有getResourcecreateResource的原因 - 由于重新使用资源对象,get可能稍微高效一些,但语义基本相同。但是,您传递给getResourcecreateResource 的参数应为URI 。如果你开始使用像"example"这样的令牌代替完整的URI,那么你将来会有麻烦,所以我建议在你习惯之前停止这个坏习惯!

答案 1 :(得分:3)

经过一番研究后,我找到了下一个方法。我不知道这是否真的是实现它的最佳方式,但有效:

Resource toSearch = ResourceFactory.createResource("example");
if(!model.containsResource(toSearch))...;