我正在研究本体种群,我想为本体中的每一个类提取限制,例如对数据属性和对象属性的一些评价、值、基数限制。我使用OWL API.now,我使用OWLClassExpression类来获取特定class.this的数据属性限制,是我的代码。
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,有人能帮我吗?
发布于 2017-09-12 22:26:17
您可以使用一个在方法中包含您的nce分支内容的OWLClassVisitor实现访问嵌套类表达式(代码中的if )。这保证您不会忘记类表达式类型之一。
https://stackoverflow.com/questions/46170981
复制相似问题