我已经构建了一个使用Jena API的应用程序,可以让你为产品创建一个本体,并拥有不同类型的产品,如运动,电子产品等。现在我要做的就是改变某些规则。就像一个规则是subClassOf
,它为您提供特定的类及其父类。进行更改以使其成为subClassOf
会给我任何该类的属性,或者除了给我父类之外,它还会返回该类的子级。基本目标是使用jena API的公理。
由于
答案 0 :(得分:0)
subClassOf
中定义的规则,例如etc/owl-fb-mini.rules
创建(或允许查询)基础图中的新三元组,现在将某个人与其祖先类相关联(通过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规则文件。如果您希望这样做,则需要研究jena-core
文档以及[andPropertiesToo: (?child rdfs:subClassOf ?parent),
(?parent ?p ?o) ->
(?child ?p ?o)
]
中的现有规则文件。
实现您的示例将是向现有RDFS或OWL规则集添加其他规则的问题:
GenericRuleReasoner
例如,您可以检索用于RDFS的规则集,然后添加此新规则,然后创建List<Rule>
,其中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();
包含所有规则:
{{1}}