如何使用RDF架构验证RDF

时间:2012-10-19 17:55:06

标签: validation rdf jena rdfs

我正在使用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();

但它总是回归真实。

3 个答案:

答案 0 :(得分: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类型的资源一起使用这是不一致的,验证应该失败。

答案 1 :(得分:1)

并非严格意义上是通过Jena或RDFS的解决方案,但有关Pellet's ICV capabilities(移植到Stardog,描述为here)的信息可能很有用。但正如Rob所说,它真的归结为开放式和封闭式世界的事情,它使它有点棘手。

答案 2 :(得分:1)

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