使用OWLAPI添加表达式编辑器公理遇Manchester解析错误如何解决
核心问题原因
你的报错是3个问题共同导致的:
- 缺少实体检查器配置:你仅给parser设置了默认本体,没有配置
OWLEntityChecker,parser无法将字符串中的Mulher匹配到本体中已存在的类,因此会直接将其识别为非法字符。 - 包含非法格式字符:你存储的
Constraint字符串Mulher EquivalentTo: (NOT Homem)里的冒号:是Protege表达式编辑器的UI装饰符号,不属于标准Manchester OWL语法的一部分,parser无法识别。 - (可选)如果你的本体类带有命名空间前缀,没有给parser配置前缀管理器也会导致实体识别失败。
解决方案
方案1:改动最小适配现有结构(推荐快速修复)
不需要修改JSON结构,只补充parser配置、处理非法字符即可:
private void loadClassConstraints(JSONArray constraints){ ManchesterOWLSyntaxParser parser = OWLManager.createManchesterParser(); parser.setDefaultOntology(this.ont); // 注入实体检查器,让parser可以识别本体中已存在的实体短名称 parser.setOWLEntityChecker(new ShortFormEntityChecker( new DefaultPrefixManager(this.ont.getPrefixManager()) )); for (int i = 0; i < constraints.length(); i++) { String rawExpr = constraints.getString(i); // 去掉语法不支持的冒号 String processedExpr = rawExpr.replace("EquivalentTo:", "EquivalentTo"); parser.setStringToParse(processedExpr); this.ont.add(parser.parseAxiom()); } }
方案2:优化存储结构降低后续出错概率(推荐长期使用)
因为你是在遍历单个类的约束,不需要在约束字符串里重复写类名,直接存储公理类型和右侧表达式即可,既减少冗余也避免实体匹配问题:
- 修改JSON中Constraint的存储格式:
"Constraint": [{"type":"EquivalentTo", "expression":"NOT Homem"}]
- 对应修改代码,手动构造公理:
// 入参新增当前遍历到的类对应的OWLClass对象 private void loadClassConstraints(OWLClass currentClass, JSONArray constraints){ ManchesterOWLSyntaxParser parser = OWLManager.createManchesterParser(); parser.setDefaultOntology(this.ont); parser.setOWLEntityChecker(new ShortFormEntityChecker( new DefaultPrefixManager(this.ont.getPrefixManager()) )); OWLDataFactory dataFactory = OWLManager.getOWLDataFactory(); for (int i = 0; i < constraints.length(); i++) { JSONObject constraintObj = constraints.getJSONObject(i); String axiomType = constraintObj.getString("type"); String expr = constraintObj.getString("expression"); parser.setStringToParse(expr); OWLClassExpression classExpr = parser.parseClassExpression(); OWLAxiom axiom = null; if ("EquivalentTo".equals(axiomType)) { axiom = dataFactory.getOWLEquivalentClassesAxiom(currentClass, classExpr); } else if ("SubClassOf".equals(axiomType)) { axiom = dataFactory.getOWLSubClassOfAxiom(currentClass, classExpr); } // 可根据业务扩展DisjointWith等其他公理类型 if (axiom != null) { this.ont.add(axiom); } } }
内容的提问来源于stack exchange,提问作者Guilherme Noronha
相关产品推荐
相关产品推荐

