You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用OWLAPI添加表达式编辑器公理遇Manchester解析错误如何解决

核心问题原因

你的报错是3个问题共同导致的:

  1. 缺少实体检查器配置:你仅给parser设置了默认本体,没有配置OWLEntityChecker,parser无法将字符串中的Mulher匹配到本体中已存在的类,因此会直接将其识别为非法字符。
  2. 包含非法格式字符:你存储的Constraint字符串Mulher EquivalentTo: (NOT Homem)里的冒号:是Protege表达式编辑器的UI装饰符号,不属于标准Manchester OWL语法的一部分,parser无法识别。
  3. (可选)如果你的本体类带有命名空间前缀,没有给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:优化存储结构降低后续出错概率(推荐长期使用)

因为你是在遍历单个类的约束,不需要在约束字符串里重复写类名,直接存储公理类型和右侧表达式即可,既减少冗余也避免实体匹配问题:

  1. 修改JSON中Constraint的存储格式:
"Constraint": [{"type":"EquivalentTo", "expression":"NOT Homem"}]
  1. 对应修改代码,手动构造公理:
// 入参新增当前遍历到的类对应的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 02:27:03