我正在启用这样的前向链接:

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 YY someProperty Z ,则它遵循 X someProperty Z

如果你想要那种推理支持,你要么需要一个自定义规则推理器(芝麻对此有一些有限的支持,很快就会以 SPIN rules 的形式提供改进的支持),或者你需要在本体语言,即 OWL(在这种情况下,需要像 Ontotext GraphDB 或 Stardog 这样的与芝麻兼容的 OWL 推理器)。或者,只需在查询时解决它(例如通过使用传递属性路径)。

关于java - 推理不会给出与 * 相同的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34079966/

10-13 01:02