我正在启用这样的前向链接:
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
链接,而不是推断的链接!但是,我想得到相同的结果,为什么我不是?
最佳答案
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 推理器)。或者,只需在查询时解决它(例如通过使用传递属性路径)。
关于java - 推理不会给出与 * 相同的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34079966/