【发布时间】:2017-09-29 15:32:55
【问题描述】:
这里的耶拿文档https://jena.apache.org/documentation/javadoc/jena/index.html 声明createOntologyModel 包含一个弱推理器,用于子类和子属性层次结构的传递闭包,这正是我所寻找的。从一个简单的模型开始:
x:A rdf:type rdfs:Class .
x:A x:prop1 x:whatever .
x:B rdf:type rdfs:Class .
x:B rdfs:subClassOf x:A .
x:B x:prop2 x:other .
x:myInstance rdf:type x:B .
我寻求查询 rdf:type x:B 并生成 B 和超类 A 的所有属性,例如
( ?all = <x:whatever> ) ( ?props = <x:prop1> ) -> ( ?type = <x:A> ) -> [Root]
( ?all = <x:A> ) ( ?props = <rdfs:subClassOf> ) -> ( ?type = <x:B> ) -> [Root]
( ?all = <x:other> ) ( ?props = <x:prop2> ) -> ( ?type = <x:B> ) -> [Root]
( ?all = <rdfs:Class> ) ( ?props = <rdf:type> ) -> ( ?type = <x:B> ) -> [Root]
我已经用这个例子做了一些试验。它编译并运行,但只产生 B 的属性并且不遍历 subClassOftree。我相信我错过了 RDF 模式的基本设置或使用,它使推理器能够做它的事情。有什么线索吗?
public class jena2 {
private static void addRaw(OntModel m, String s, String p, String o) {
m.add(ResourceFactory.createStatement(
new ResourceImpl(s),new PropertyImpl(p),new ResourceImpl(o))
);
}
public static void main(String[] args) {
OntModel model = ModelFactory.createOntologyModel();
addRaw(model, "x:A", "rdf:type", "rdfs:Class");
addRaw(model, "x:A", "x:prop1", "x:whatever");
addRaw(model, "x:B", "rdf:type", "rdfs:Class");
addRaw(model, "x:B", "x:prop2", "x:other");
addRaw(model, "x:B", "rdfs:subClassOf", "x:A");
addRaw(model, "x:widget", "rdf:type", "x:B");
StringBuffer sb = new StringBuffer();
sb.append("PREFIX x: <x:>");
sb.append("PREFIX rdf: <rdf:>");
sb.append("PREFIX rdfs: <rdfs:>");
sb.append("SELECT *");
sb.append("WHERE {");
sb.append(" x:widget rdf:type ?type .");
sb.append(" ?type ?props ?all .");
sb.append("}");
Query query = QueryFactory.create(sb.toString());
try (QueryExecution qexec = QueryExecutionFactory.create(query, model)) {
ResultSet results = qexec.execSelect() ;
for ( ; results.hasNext() ; ) {
QuerySolution soln = results.nextSolution() ;
System.out.println(soln);
}
} catch(Exception e) {
System.out.println("epic fail: " + e);
}
}
【问题讨论】:
-
该代码永远无法工作:您不能添加语句并简单地使用前缀 URI - API 应该如何知道要解析哪个完整 URI?例如,您添加
"x:A", "rdf:type", "rdfs:Class"-> "rdf:type" 将永远不会被解析为正确的 URIhttp://www.w3.org/1999/02/22-rdf-syntax-ns#type。所有其他人也是如此。所有没有指定协议的都将被解析为本地 URI。 -
同样适用于 SPARQL 查询:
PREFIX rdfs: <rdfs:>与 RDFS 命名空间无关,需要完整的 URI -
@AKSW 是的;我只是在尝试切换到 RDF.type 和 RDFS.subClassOf 等。我可以明白为什么我需要完整的 URI 来推理引擎来做这件事(因为它正在寻找它们)但不应该是我自己的类用一个简单的 x: 前缀就可以了?
-
是的,应该。我在下面添加了一些对我有用的代码。您可以检查这是否是您需要的,或者是否仍然缺少某些东西
标签: java sparql jena inference