我正在启用这样的正向链接:
static final String inputData = "http://cgi.di.uoa.gr/~pms509/past_projects/2014-2015/hw1/kallikratis.n3";
MemoryStore store = new MemoryStore();
Repository repo = new SailRepository(new ForwardChainingRDFSInferencer(store));
System.out.println("Forward chaining enabled");
repo.initialize();
//Store file
File file = new File(inputData);
String fileBaseURI = "http://www.semanticweb.org/owl/owlapi/turtle";
RDFFormat fileRDFFormat = RDFFormat.N3;
RepositoryConnection con = repo.getConnection();
con.add(file, fileBaseURI, fileRDFFormat);
...
然后我这样查询:
"SELECT ?class " +
"WHERE {" +
"?rsrc geo:has_name \"foo\" . " +
"?rsrc geo:belongs_to ?a ." +
"}";
然而, 不 会给我与geo:belongs_to*
相同的结果。我将只获得直接的belongs_to
链接,而不是我所期望的推断链接!
我想得到相同的结果,为什么我不是?
答案 0 :(得分:4)
RDFS推理器仅确实是RDFS推理 - 也就是说,它使用RDF Semantics中定义的规则。这些规则仅涵盖相对基本的内容,例如子类/类型继承和域/范围推断。例如,如果您的数据具有类Car
并且它将Car
定义为Vehicle
的子类,那么RDFS推理器将推断出类Car
的任何实例是也是 Vehicle
的实例。
但是这种继承仅适用于这些特定关系(子类,类型,子属性)。它不会在一般情况下自动推断,如果X someProperty Y
和Y someProperty Z
,那么它会跟随X someProperty Z
。
如果您需要这种推理支持,您需要一个自定义规则推理器(芝麻对此有一些有限的支持,以及SPIN rules即将推出的改进支持),或者您需要移动本体语言中的表达性的下一级别,即OWL(在这种情况下,需要与Ontotext GraphDB或Stardog一样的芝麻兼容的OWL推理器)。或者,只需在查询时解决它(例如通过使用传递属性路径)。