2014-05-20 38 views
0

我創建了一個耶拿規則裏森納如文檔在Jena的規則reasoners中記錄先前聲明的三元組的推導?

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存在的三元組不會被重新推斷推理者,即使他們可能是這樣,這意味着將不存在這樣的三元組派生記錄。有沒有辦法迫使推理者重新推斷並記錄原始數據中已存在的三元組的派生?

+1

爲了有助於回答這個問題,請你提供一些關於通過讓推理記錄這些推導可以滿足的目標的背景嗎?例如,您是否嘗試識別三元組,如果已刪除,可能會/將被當前規則集重新派生? –

+0

@RobHall是的,我想要檢查所有三元組的派生路徑,甚至可以在被移除後推斷出那些派生路徑 – riad

回答

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全部。

請注意,此操作的行爲可能不一致或預期,特別是在存在多個派生路徑的情況下。祝你好運。

+0

說實話,我已經想過你給出的解決方案,並且正如你所說的那樣昂貴。我希望有人會給我一個更好的解決方案。不管怎麼說,還是要謝謝你。 – riad

+0

如果這個答案最終反映了您的解決方案,請考慮將其標記爲已接受。 –

+0

正如我所說,它並不反映我將與之合作的解決方案,對不起,使用大型rdf文件做這件事將會非常昂貴。 – riad