4

我正在使用 Jena 框架来操作 RDF 文件,但我找不到使用您各自的 RDFSchema 验证 RDF 的方法。我正在尝试以下方法:

Model mod1 = new ModelMem();
Model modSchema = new ModelMem();
String baseURI = "http://iec.ch/TC57/2007/network";

String rdfPath = "file:D:\\modelo.rdf";
InputStream model = FileManager.get().open(rdfPath);

String rdfPathSchema = "file:D:\\Schema.rdf";
InputStream modelSchema = FileManager.get().open(rdfPathSchema);

mod1.read(model, baseURI, "RDF/XML-ABBREV");
modSchema.read(modelSchema,baseURI,  "RDF/XML-ABBREV");
InfModel infmodel = ModelFactory.createRDFSModel(mod1, modSchema);
ValidityReport validity = infmodel.validate();
return validity.isValid();

但它总是返回 true。

4

3 回答 3

1

您确定它并不总是仅仅因为您尝试过的所有输入都是有效的而返回 true 吗?您是否尝试过创建相对于架构明确无效的输入并对其进行测试?

不管 RDF Schema 不是 XML Schema 那样的严格模式,您可能想看看Jena Eyeball,它是另一个基于 Jena 的用于检查 RDF 的工具,但不确定它是否能满足您的要求。

如果您仍有问题,请尝试在 Jena 邮件列表中询问 - users@jena.apache.org

编辑

请注意,仅当您以与架构不一致的方式使用某些内容时,验证才会返回 false。创建您可能认为无效的数据的拼写错误和其他用户错误可能仍然与 RDF 模式完全一致。

例如,假设您有一个简单的 RDF 模式,如下所示:

:ValidType a rdfs:Class .

:property a rdf:Property ;
          rdfs:domain :ValidType .

所以这个模式表明你有一个类和一个具有该类域的属性。

然后,用户打错字并在他们的数据中包含以下内容:

:subj a :InvalidType .

这本身并不矛盾,因为 RDF 有一个开放世界假设。声明某事物的类型未包含在您的 RDF 模式中不会导致验证失败,从验证的角度来看,这只是虚假信息。

但是,如果用户随后声明:subj使用了您定义的属性,如下所示:

:subj a :InvalidType ;
      :property "value" .

现在验证应该返回 false,因为数据将与架构不一致,您声明:property唯一的域:ValidType但它与类型的资源一起使用,:InvalidType因此这是不一致的并且验证应该失败。

于 2012-10-19T18:01:40.477 回答
1

严格来说,不是通过 Jena 或通过 RDFS 的解决方案,但有关Pellet 的 ICV 功能的信息(移植到 Stardog,在此处描述)可能有用。但正如 Rob 所说,这真的归结为开放与封闭世界的事情,这让它有点棘手。

于 2012-10-22T00:17:43.373 回答
1

我找到了使用 RDF Schema 验证 RDF 的解决方案。存在一个名为 CIMValidation 的工具。我们可以在应用程序 java 中使用它,只需将 .jar 添加到构建路径并使用 RDFSValidator 类。谢谢大家的回答。

于 2012-10-26T17:19:42.650 回答