2014-05-13 21 views
0

我已經構建了一個使用Jena API的應用程序,可以爲產品創建本體並擁有不同類型的產品,如運動,電子產品等。現在我所要做的就是更改某些規則。像一個規則是subClassOf,它給你特定的類和它的父類。做一個改變,使它成爲subClassOf會給我任何這個類的屬性或旁邊給我的父類,它會返回我的那個類的孩子。基本目標是玩jena API的公理。在JENA API中更改公理API

由於

回答

0

定義在例如etc/owl-fb-mini.rules用於subClassOf規則創建(或允許查詢)在底層的圖,現在涉及一些個別其祖先類(通過subClassOf)新的三元組而不是其直接父。這些規則試圖實現rdfs和owl推理。

因此,舉例來說,如果你的圖形包含:

<urn:ex:instance> <rdf:type> <urn:ex:ClassA> 
<urn:ex:ClassA> <rdfs:subClassOf> <urn:ex:ClassB> 

然後,基本類推理,圖形應該表現爲儘管它包含以下三元組,而不是:

<urn:ex:instance> <rdf:type> <urn:ex:ClassA> 
<urn:ex:ClassA> <rdfs:subClassOf> <urn:ex:ClassB> 
<urn:ex:instance> <rdf:type> <urn:ex:ClassB> 

如果你想改變用RDF表達的OWL或RDFS公理的解釋,也就是說,你可以通過圖表訪問三倍,那麼你需要製作你自己的rdfs和/或owl規則文件。如果您希望這樣做,您需要學習Reasoners and Rule Engines文檔以及jena-core中的現有規則文件。

實現您的例子是增加一個額外的規則到現有RDFS或OWL規則集的問題:

[andPropertiesToo: (?child rdfs:subClassOf ?parent), 
        (?parent ?p ?o) -> 
        (?child ?p ?o) 
] 

你可以,例如,檢索用於RDFS的一套規則,然後添加這個新規則,然後創建一個GenericRuleReasoner其包含所有這些:

final String customRule = 
    "[andPropertiesToo: (?child rdfs:subClassOf ?parent),\n"+ 
    "(?parent ?p ?o) ->\n"+ 
    "(?child ?p ?o)\n"+ 
    "]"; 

final List<Rule> customRules = new ArrayList<Rule>(){{ 
    this.addAll(RDFSRuleReasoner.loadRulesLevel(RDFSRuleReasoner.SIMPLE_RULES)); 
    try(final BufferedReader src = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(customRule.getBytes())))) { 
     this.addAll(Rule.parseRules(Rule.rulesParserFromReader(src))); 
    } 
}}; 

final RuleReasoner reasoner = (RuleReasoner)GenericRuleReasonerFactory.theInstance().create(null); 
reasoner.setRules(customRules); 

final InfModel model = ModelFactory.createInfModel(reasoner, ModelFactory.createDefaultModel()); 
model.prepare();