我正在尝试使用sparql和使用蕴涵。
作为一个例子,我使用了http://www.w3.org/TR/2010/WD-sparql11-entailment-20100126/#t112
我试着把它们放进jena。
OntClass book1= model.createClass(NS+"book1");
OntClass book2=model.createClass(NS+"book2");
OntClass book3=model.createClass(NS+"book3");
OntClass publication=model.createClass(NS+"publication");
OntClass article=model.createClass(NS+"article");
OntClass mit=model.createClass(NS+"MIT");
ObjectProperty a = model.createObjectProperty(NS+"a");
ObjectProperty publishes = model.createObjectProperty(NS+"publishes");
book1.addProperty(a, publication);
book2.addProperty(a, article);
publication.addSubClass(article);
publishes.addRange(publication);
mit.addProperty(publishes, book3);
其中model是OntModel类型。
我使用类似问题的查询
"PREFIX table: "I have correct namespace here"+
"SELECT *"+
"WHERE"+
"{"+
" ?x ?y table:publication ."+
"}";
模型是这样创建的。希望OntModelSpec没问题。
OntModel m = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM_RDFS_INF, null);
我从查询
获得结果
x y
| http://www.example.com/ontologies/sample.owl#publishes | rdfs:range |
| http://www.example.com/ontologies/sample.owl#article | rdfs:subClassOf |
| http://www.example.com/ontologies/sample.owl#book1 | http://www.example.com/ontologies/sample.owl#a |
| http://www.example.com/ontologies/sample.owl#publication | rdfs:subClassOf |
| http://www.example.com/ontologies/sample.owl#book3 | rdf:type |
任何人都可以给我一个例子,有无蕴涵,所以无法尝试代码,可以得到正确的结果。
答案 0 :(得分:2)
你的本体看起来有点可疑。
book1
,book2
,book3
和mit
不是课程,而是个人。您应该使用model.createIndividual(NS + "bookX", publication)
作为书籍,并为“组织”或类似项创建一个类,然后创建mit
作为该类的个人。请注意,createIndividual
已经负责将类型分配给个人,因此您无需使用“a
”属性。您应该先修复这些内容,然后再试一次并更新您的问题。
关于蕴涵:查看查询结果的最后一行。你没有说book3
是一本书的任何地方,但无论如何声明都在那里。这是因为它是由其他语句引起的,这就是为什么RDFS推理引擎在查询模型时使语句可见。由于publishes
上的范围,因此需要声明:发布的所有内容都必须属于publication
类型。