我正在使用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();
但它总是回归真实。
答案 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类。 谢谢你的回答。