我已经构建了一个使用 Jena API 的应用程序,让您可以为产品创建本体,并拥有不同类型的产品,如运动、电子产品等。现在我要做的是更改某些规则。就像一条规则一样subClassOf
,它为您提供特定的类及其父类。进行更改以使其成为 asubClassOf
将给我该类的任何属性,或者除了给我父类之外,它还会返回我该类的子类。基本目标是玩耶拿 API 的公理。
谢谢
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 规则文件版本。如果您希望这样做,您将需要研究Reasoners 和 Rule Engines文档以及jena-core
.
实施您的示例将是向现有 RDFS 或 OWL 规则集添加附加规则的问题:
[andPropertiesToo: (?child rdfs:subClassOf ?parent),
(?parent ?p ?o) ->
(?child ?p ?o)
]
例如,您可以检索用于 RDFS 的规则集,然后也添加这个新规则,然后创建一个包含所有规则GenericRuleReasoner
的规则: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();