首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用OWL检索OWL类限制

使用OWL检索OWL类限制
EN

Stack Overflow用户
提问于 2017-09-12 07:58:30
回答 1查看 300关注 0票数 0

我正在研究本体种群,我想为本体中的每一个类提取限制,例如对数据属性和对象属性的一些评价、值、基数限制。我使用OWL API.now,我使用OWLClassExpression类来获取特定class.this的数据属性限制,是我的代码。

代码语言:javascript
复制
    private static JSONObject getclassaxioms(OWLClass cls,OWLOntology ontology){
    Set<OWLClassAxiom> tempAx=ontology.getAxioms(cls);
    JSONObject datapropertyrestrictions = new JSONObject();
    JSONArray data_has_value = new JSONArray();
    JSONArray data_max_cardinality = new JSONArray();
    JSONArray data_all_values_from = new JSONArray();
    JSONArray data_exact_cardinality = new JSONArray();
    JSONArray data_min_cardinality = new JSONArray();
    JSONArray data_some_values_from = new JSONArray();
    for(OWLClassAxiom ax: tempAx){
        for(OWLClassExpression nce:ax.getNestedClassExpressions()) {

            if(nce.getClassExpressionType()==ClassExpressionType.DATA_HAS_VALUE) {
               // System.out.println("\t\t\tDATA_HAS_VALUE:" + nce.getNNF());
                String dpString = nce.toString();
                String propertyname;
                String enumm;
                String datatype;
                JSONObject hasdatavalueobj = new JSONObject();
                if (dpString.contains("#")) {
                    propertyname = dpString.substring(
                            dpString.indexOf("#") + 1,
                            dpString.lastIndexOf(">"));
                    hasdatavalueobj.put("propertyname",propertyname);
                }
                if(dpString.contains("\"")){
                    enumm = dpString.substring(
                            dpString.indexOf("\"") + 1,
                            dpString.lastIndexOf("\""));
                    hasdatavalueobj.put("enumvalue",enumm);
                }
                if(dpString.contains("xsd")){
                    datatype = dpString.substring(
                            dpString.indexOf("xsd") + 4,
                            dpString.lastIndexOf(")"));
                    hasdatavalueobj.put("datatype",datatype);
                }
                data_has_value.add(hasdatavalueobj);
               // System.out.println(hasdatavalueobj);

                //System.out.println(nce.toString());
            }
            if(nce.getClassExpressionType()==ClassExpressionType.DATA_MAX_CARDINALITY) {
               // System.out.println("\t\t\tDATA_MAX_CARDINALITY:" + nce.getNNF());
                JSONObject hasdatavalueobj = getCardinality(nce.toString());
                data_max_cardinality.add(hasdatavalueobj);
                System.out.println(nce.toString());
                System.out.println(hasdatavalueobj);
            }
            if(nce.getClassExpressionType()==ClassExpressionType.DATA_ALL_VALUES_FROM) {
                //System.out.println("\t\t\tDATA_ALL_VALUES_FROM:" + nce.getNNF());
                data_all_values_from.add(nce.getNNF().toString());
            }
            if(nce.getClassExpressionType()==ClassExpressionType.DATA_EXACT_CARDINALITY) {
                //System.out.println("\t\t\tDATA_EXACT_CARDINALITY:" + nce.getNNF());
                JSONObject hasdatavalueobj = getCardinality(nce.toString());
                data_exact_cardinality.add(hasdatavalueobj);
                System.out.println(nce.toString());
                System.out.println(hasdatavalueobj);
            }
            if(nce.getClassExpressionType()==ClassExpressionType.DATA_MIN_CARDINALITY) {
                //System.out.println("\t\t\tDATA_MIN_CARDINALITY:" + nce.getNNF());
                JSONObject hasdatavalueobj = getCardinality(nce.toString());
                data_min_cardinality.add(hasdatavalueobj);
                System.out.println(nce.toString());
                System.out.println(hasdatavalueobj);
            }
            if(nce.getClassExpressionType()==ClassExpressionType.DATA_SOME_VALUES_FROM) {
               // System.out.println("\t\t\tDATA_SOME_VALUES_FROM:" + nce.getNNF());
                data_some_values_from.add(nce.getNNF().toString());
                System.out.println(nce.toString());
            }
            //if(nce.getClassExpressionType()==ClassExpressionType.)
        }
    }
    datapropertyrestrictions.put("data_has_value",data_has_value);
    datapropertyrestrictions.put("data_max_cardinality",data_max_cardinality);
    datapropertyrestrictions.put("data_all_values_from",data_all_values_from);
    datapropertyrestrictions.put("data_exact_cardinality",data_exact_cardinality);
    datapropertyrestrictions.put("data_min_cardinality",data_min_cardinality);
    datapropertyrestrictions.put("data_some_values_from",data_some_values_from);
    return datapropertyrestrictions;
}
private static JSONObject getCardinality(String dpString){
    String propertyname;
    String cardinalityvalue;
    String datatype;
    JSONObject hasdatavalueobj = new JSONObject();
    if (dpString.contains("#")) {
        propertyname = dpString.substring(
                dpString.indexOf("#") + 1,
                dpString.lastIndexOf(">"));
        hasdatavalueobj.put("propertyname",propertyname);
    }
    if(dpString.contains("(")){
        cardinalityvalue = dpString.substring(
                dpString.indexOf("(") + 1,
                dpString.lastIndexOf("<") -1 );
        hasdatavalueobj.put("cardinalityvalue",cardinalityvalue);
    }
    if(dpString.contains("DataRangeRestriction")) {
        if (dpString.contains("xsd")) {
            datatype = dpString.substring(
                    dpString.indexOf("xsd") + 4,
                    dpString.lastIndexOf(" "));
            hasdatavalueobj.put("datatype", datatype);
        }
    }
    else{
        if (dpString.contains("xsd")) {
            datatype = dpString.substring(
                    dpString.indexOf("xsd") + 4,
                    dpString.lastIndexOf(")"));
            hasdatavalueobj.put("datatype", datatype);
        }
    }
    return hasdatavalueobj;
}

我得到了数据属性限制IRI,并使用string类函数,我在json上记录了这些限制。我认为这是一个最糟糕的implementation.Please,有人能帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-12 22:26:17

您可以使用一个在方法中包含您的nce分支内容的OWLClassVisitor实现访问嵌套类表达式(代码中的if )。这保证您不会忘记类表达式类型之一。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46170981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档