2013-11-22 16 views
1

입력 클래스의 하위 클래스를로드하는 메서드를 작성하려고합니다. 이 코드는 OWL API 3.1.x (Pizza.owl)로 작성된 RDF 파일로 제대로 작동하지만 이제는 OWL API 3.4.x 버전에서 생성 된 파일과 작동하지 않습니다.OWLapi에서 전용 클래스의 하위 클래스를 검색하려면 어떻게해야합니까?

<!DOCTYPE Ontology [ 
<!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" > 
<!ENTITY xml "http://www.w3.org/XML/1998/namespace" > 
<!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" > 
<!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" > 
]> 


<Ontology xmlns="http://www.w3.org/2002/07/owl#" 
xml:base="http://localhost/CA/SmartHome/SmartHome_1113" 
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema#" 
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
xmlns:xml="http://www.w3.org/XML/1998/namespace" 
ontologyIRI="http://localhost/CA/SmartHome/SmartHome_1113"> 
<Prefix name="" IRI="http://localhost/CA/SmartHome/SmartHome_1113.owl#"/> 
<Prefix name="owl" IRI="http://www.w3.org/2002/07/owl#"/> 
<Prefix name="rdf" IRI="http://www.w3.org/1999/02/22-rdf-syntax-ns#"/> 
<Prefix name="xsd" IRI="http://www.w3.org/2001/XMLSchema#"/> 
<Prefix name="rdfs" IRI="http://www.w3.org/2000/01/rdf-schema#"/> 
<Declaration> 
    <Class IRI="#Adult"/> 
</Declaration> 

<Declaration> 
    <Class IRI="#Person"/> 
</Declaration> 

<SubClassOf> 
    <Class IRI="#Adult"/> 
    <Class IRI="#Person"/> 
</SubClassOf> 

</Ontology> 

그것은 두 클래스로 구성된 매우 간단 온톨로지, 그리고 성인이이다 : 이것은 OWL의 API 3.4.2에 의해 생성 된 올빼미 파일이

public ArrayList<String> getSubClassOf(String parentClass) 
{ 
    String seq = ""; 
    tempList.clear(); 
    tempClass = factory.getOWLClass(":" + parentClass, pm); 
    s = reasoner.getSubClasses(tempClass, false); 
    i = s.iterator(); 
    while(i.hasNext()){ 
     seq = i.next().toString(); 
     if(!seq.contains("Nothing")) 
      tempList.add(seq.substring(seq.indexOf("#")+1,seq.indexOf(">"))); 
    }  
    return tempList;    
} 

입니다 : 여기에 아래

은 내가 쓴 코드 사람의 하위 클래스

답변

1

일부 복제본이 코드에서 정의되지 않았기 때문에 문제를 재현했지만 코드를 사용할 수 없습니다. 내가 사용하고있는 접두어 관리자 나 클래스 이름에 문제가있는 것이 아닌가? 다음 코드는 결과로 성인을 제공

public static void main(String[] args) throws Exception { 
    OWLOntologyManager manager = OWLManager.createOWLOntologyManager(); 
    // load the importing ontology 
    OWLOntology ontology = manager.loadOntologyFromOntologyDocument(new StringDocumentSource(test_owl)); 
    OWLReasoner r = new FaCTPlusPlusReasonerFactory().createReasoner(ontology); 
    OWLClass person = ontology.getOWLOntologyManager().getOWLDataFactory().getOWLClass(IRI.create("http://localhost/CA/SmartHome/SmartHome_1113#Person")); 
    Set<OWLClass> classes = r.getSubClasses(person, false).getFlattened(); 
    System.out.println(classes); 
} 

출력은 다음과 같습니다 당신이 문자열을 구문 분석 할 필요가 없습니다

[<http://localhost/CA/SmartHome/SmartHome_1113#Adult>, owl:Nothing]

공지 사항 당신이 원하는 결과를 얻을 수 있습니다. 답장을 보내 (내가 3.4.8를 사용)

+0

감사를 OWLEntity은 아무것도 일치하지 않는 경우를 결정하는 방법을 가지고, 당신은 온톨로지는 모두 3.1 및 3.4.x와 유효해야 OWLEntity.getIRI().getFragment()

와 IRI 조각을 얻을 수 있습니다 , 그러나 어떻게 든 그것은 나를 위해 일하지 않고있다. Person 클래스를 올바르게 가져 오지만 그 클래스의 하위 클래스를 얻지는 못합니다. FaCT ++ 대신 Pellet reasoner를 사용했습니다. 그것은 문제 일 수 있습니까? – Jun1987

+0

나는 이상하게도이 문제를 해결했다 .. 3.1.x 형식의 OWL 파일을 생성하고 protge와 함께 온톨로지를 만들기 시작했다. 그런 다음, protege는 위에 게시 된 형식이 아닌 3.1.x 형식으로 RDF 파일을 생성하기 시작했습니다. 그리고 나서, 내 코드가 완벽하게 작동했고 lgnazio도 완벽하게 작동했습니다. 이 문제를 해결하려면 Plz, 의견을 남겨주세요. – Jun1987

+0

3.1과이 코드의 차이점은 무엇인지 말할 수 없습니다. 나는 단지 IRI에 몇 가지 오타가 있다고 가정하고 파일을 재생성했다. – Ignazio

관련 문제