0

我在文档中创建了一个 Jena Rule Reasoner

final String rules = "[rule1: (?a urn:eg:p ?b) (?b urn:eg:p ?c) -> (?a urn:eg:p ?c)]";
final Reasoner reasoner = new GenericRuleReasoner(Rule.parseRules(rules));
reasoner.setDerivationLogging(true);
final InfModel inf = ModelFactory.createInfModel(reasoner, rawData);

一切正常,我可以检查推断模型中三元组的推导,但是rawData推理器不会重新推断已经存在的三元组,即使它们可以,这意味着不会有推导的记录这样的三元组。有没有办法强制推理器重新推断和记录原始数据中已经存在的三元组的推导?

4

1 回答 1

0

不幸的是,我想不出一种方法来强迫 Jena 为原始数据中的信息构建推导。然而,我可以想出一种蛮力的方式来导出可以导出的信息,从而导致推导。

考虑以下 (JUnit) 测试通过的结果:

final Property p = ResourceFactory.createProperty("urn:eg:p");

final Model rawData = ModelFactory.createDefaultModel();
final Resource a = rawData.createResource("urn:a");
final Resource b = rawData.createResource("urn:b");
final Resource c = rawData.createResource("urn:c");
a.addProperty(p, b);
b.addProperty(p, c);
a.addProperty(p, c);

final String rules = "[rule1: (?a urn:eg:p ?b) (?b urn:eg:p ?c) -> (?a urn:eg:p ?c)]";
final Reasoner reasoner = new GenericRuleReasoner(Rule.parseRules(rules));
reasoner.setDerivationLogging(true);
final InfModel inf = ModelFactory.createInfModel(reasoner, rawData);

assertTrue(inf.contains(a,p,c));
final Iterator<Derivation> d0 = inf.getDerivation(inf.asStatement(Triple.create(a.asNode(), p.asNode(), c.asNode())));
assertFalse(d0.hasNext());

inf.remove(a,p,c);

assertTrue(inf.contains(a,p,c));
final Iterator<Derivation> d1 = inf.getDerivation(inf.asStatement(Triple.create(a.asNode(), p.asNode(), c.asNode())));
assertTrue(d1.hasNext());

实际上,如果您从图中删除了原始数据中的三元组,那么,如果可以导出该三元组,它将保留在图中。然后你可以得到推导。您可以使用以下循环对图中的所有三元组安全地执行此(昂贵的)操作:

final Set<Statement> statements = new HashSet<>(rawData.listStatements().toSet());
for( final Statement s : statements ) {
    assert(inf.contains(s));
    inf.remove(s);
    if(!inf.contains(s)) {
        System.out.println("Cannot derive statement from raw data: "+s);
        inf.add(s);
    } else {
        System.out.println("Derivable statement removed from raw data: "+s);
    }
}

对于上面的示例数据(假设我们在创建后删除所有内容inf并将其替换为我们的循环),输出如下:

Derivable statement removed from raw data: [urn:a, urn:eg:p, urn:c]
Cannot derive statement from raw data: [urn:b, urn:eg:p, urn:c]
Cannot derive statement from raw data: [urn:a, urn:eg:p, urn:b]

您的数据现在处于一种状态,您可以获得所有可推导事物的推导,并且只有最少量的rawData剩余物可以让您得出整个inf.

请注意,此操作的行为可能不一致或不符合预期,尤其是在存在多个派生路径的情况下。祝你好运。

于 2014-05-21T15:15:05.317 回答