2013-07-12 2 views
0

온톨로지 (가져온 온톨로지를 포함한 완성품)를 구문 분석하여 그래프 데이터베이스에 저장하려고합니다. 이를 위해 먼저 온톨로지의 모든 클래스를 나열한 다음 해당 클래스를 각각의 수퍼 클래스에 연결합니다.가져온 OWL 온톨로지에서 슈퍼 클래스 얻기

가져온 수퍼 클래스를 제외하고 코드는 정상적으로 작동합니다. 내 자신의 온톨로지 내에서 슈퍼 클래스에 연결할 수 있지만 가져온 온톨로지에 슈퍼 클래스가있는 클래스에서는 연결할 수 없습니다. 수퍼 클래스가 존재하며 가져온 클래스를 추가하기 위해 true를 지정했기 때문에 getClasesInSignature() 메서드 호출 이후에 인쇄하면 볼 수 있습니다.

이 코드 예제에서, 수퍼 클래스 집합의 출력은 위에서 설명한대로 클래스에 대해 비어 있습니다. 그들을 포함시킬 수있는 방법이 있습니까?

public void importOntology(String ontologyFile) throws Exception { 
    try { 
     File file = new File(ontologyFile); 
     if (file.exists()) { 
      OWLOntologyManager manager = OWLManager.createOWLOntologyManager(); 
      OWLOntology ontology = manager.loadOntologyFromOntologyDocument(file); 
      OWLReasonerFactory reasonerFactory = PelletReasonerFactory.getInstance(); 
      OWLReasoner reasoner = reasonerFactory.createReasoner(ontology, new SimpleConfiguration()); 
      if (!reasoner.isConsistent()) { 
       throw new Exception("Ontology is inconsistent"); 
      } 

      Transaction tx = db.beginTx(); 
      try { 
       //create starting node 
       Node thingNode = getOrCreateNodeWithUniqueFactory("owl:Thing"); 

       //add all classes 
       for (OWLClass c :ontology.getClassesInSignature(true)) { 
        String classString = c.toString(); 
        if (classString.contains("#")) { 
         classString = classString.substring(classString.indexOf("#")+1,classString.lastIndexOf(">")); 
        } 
        //create node 
        Node classNode = getOrCreateNodeWithUniqueFactory(classString); 

        Set<OWLClassExpression> superclasses = c.getSuperClasses(ontology); 

        //top level node 
        if (superclasses.isEmpty()) { 
         //link to thing 
        } else { 
         //link to superclass(es) 
        } 

        //[rest of code removed] 
      } 
     } 
    } 

답변

2

OK, 일부 연구 후에, 나는 OWLReasoner 또한 슈퍼 클래스를 얻을 수있는 기능을 가지고 있다는 것을 발견했다. 이 방법은 가져온 온톨로지의 수퍼 클래스를 포함하며 직접 슈퍼 클래스와 간접 수퍼 클래스를 구별 할 수 있습니다. 조금 이상한데, getClassesInSignature()에는 추론 자에 액세스하지 않고 포함되어 있지만 이것이 제대로 작동하고 내 문제가 해결되었습니다.

코드는

NodeSet<OWLClass> superclasses = reasoner.getSuperClasses(c, true); 

이 클래스를 얻을 수있을 것이다. 반환 유형이 다른 이유는 다음과 같습니다.

for (org.semanticweb.owlapi.reasoner.Node<OWLClass> parentOWLNode: superclasses) {      
    OWLClassExpression parent = parentOWLNode.getRepresentativeElement(); 
+0

언제든지 블로그에서 공유 할 수 있습니다 - Neo4j 위에 OWLAPI를 구현 하시겠습니까? supercool 것입니다. –