2012-09-01 2 views
0

Java 및 Jena API를 사용하고 있습니다. 나는 클래스 결혼을"hasHusband", "Haswife""dateOfMarriage"라는 3 개 개체 속성을 가지고. 처음 두가 Person 클래스 datatypeproperties있다과 관련된hasFirstName, hasLastName, 생년월일 (DateOfBirth) .... 나는 남편의 hasFirstName의 속성에 액세스 할 수 있습니다 아래의 코드를 통해Java - Jena API - 둘 이상의 데이터 유형 얻기

.

StmtIterator iter = onto.model.listStatements(null,onto.hasHusband,(RDFNode)null); 
while (iter.hasNext()) { 
    Statement stmt = iter.nextStatement(); 
    Resource P = ((Resource) stmt.getObject()); 

    StmtIterator iter2 = onto.model.listStatements(((Resource) P),onto.hasFirstName,(RDFNode)null); 
    while (iter2.hasNext()) { 
     Statement stmt2 = iter2.nextStatement(); 
     firstnameHusband = stmt2.getObject().toString(); 
    }} 

나는 또한 액세스 hasLastName 및 hasDateofBirth하기 위해이 줄을

StmtIterator iter2 = onto.model.listStatements(((Resource) P),onto.hasFirstName,(RDFNode)null); 

을 수정하고 싶습니다 ...

당신은 내가이 작업을 수행 할 수있는 방법을 나에게 설명 할 수 ?

감사 편집을 할

: @Pierre 지금 만 Person 클래스에 관한 것이다.

[label= \"" +firstName+ " \"\n\n\"D.Naiss:"+dnai1+"\", "+shape+"] 

diference : 각 사람이에 대한

[label= \"" +firstName+ " \"\n\n\"D.Naiss:"+dnai1+"\", "+shape2+"] 

그리고 : 여자의 경우 나는 새 파일 (텍스트 파일)에서 출력 각 여성에 대한 다음이 줄을 원하는 모양의 가치에있다. 내가 가진 문제는 그가 한 명의 여성과 한 명의 남자만을 산출한다는 것입니다.

사람은 내 RDF 파일에 다음과 같이 표시됩니다 : 여기

<rdf:Description rdf:about="http://www.fam.com/FAM#Bruno04/02/1980 "> 
    <j.0:FAMhasGender>H</j.0:FAMhasGender> 
    <j.0:FAMhasDateOfBirth>04/02/1980</j.0:FAMhasDateOfBirth> 
    <j.0:FAMhasLastName>DS </j.0:FAMhasLastName> 
    <j.0:FAMhasFirstName> Bruno</j.0:FAMhasFirstName> 
    </rdf:Description> 

는 관련 코드입니다 :

public void accessProp() { 

    readFile(inputFile); // rdf 
    String fname; 
    String dd; 
    String gen; 

    ExtendedIterator instances = onto.person.listInstances(); 
    Individual instance = null; 
    Individual firstInstance = null; 
    while (instances.hasNext()) { 
     instance = (Individual) instances.next(); 

     gen = instance.getPropertyValue(onto.hasGender).toString(); 
     fname = instance.getPropertyValue(onto.hasFirstName).toString(); 
     dd = instance.getPropertyValue(onto.hasDateOfBirth).toString(); 

     writeFile(fname, dd, genr); 
    } 
} 

// Write text file 
public void writeFile(String fn, String dbir, String gn) { 
    String fileout = "D:/file1.txt"; 
    String firstName = fn; 
    String dateB = dbir; 
    String gender = gn; 

    BufferedWriter out; 
    try { 
     out = new BufferedWriter(new FileWriter(fileout, true)); 

     if (gender.equals("F")) { 
      out.write("[label= \"" + firstName + " \"\n\n\"D.Naiss:" + dnai1 + "\", " + shape + "]"); 
     } 

     else if (gender.equals("M")) { 
      out.write("[label= \"" + firstName + " \"\n\n\"D.Naiss:" + dnai1 + "\", " + shape2 + "]"); 
     } 

     out.newLine(); 

     // flushes and closes the stream 
     out.close(); 
    } catch (IOException e) { 
     System.out.println("There was a problem:" + e); 
    } 
} 

당신이 내 문제를 해결하기 위해 무엇을해야하는지 말해 줄 수 있습니까?

감사

답변

-1

특정 속성을 얻을 수있는 도우미 함수를 만듭니다

public RDFNode getProperty(Resource subject,Property prop) 
    { 
    RDFNode object=null; 
    StmtIterator iter2 = this.onto.model.listStatements(subject,prop,(RDFNode)null); 
    while (iter2.hasNext()) { 
     object = iter2.nextStatement().getObject(); 
     break; 
    }} 
    iter2.close(); 
    return object; 
    } 

public String getPropertyAsString(Resource subject,Property prop) 
    { 
    RDFNode object=getProperty(subject,prop); 
    return object==null?null:object.toString(); 
    } 

(...) 
String s1=getPropertyAsString(P,onto.hasFirstName); 
String s2=getPropertyAsString(P,onto.hasLastName); 
(...) 
+0

그게 다야, 고마워, 피에르! – user1632278

+0

안녕하세요, 피에르, 내 질문을 편집했습니다. 다른 문제가 좀 있습니다. 어쩌면 저를 도울 수 있습니다. 감사 – user1632278

2

나는 질문의 의도를 이해한다면, 당신은 당신에게 이름을 제공 반복자, 성, 날짜를 원하는 생년월일 등. 이터레이터는 리소스 당 하나의 행이됩니다.

SPARQL이 수행 할 수있는 작업입니다.개요에서

:

PREFIX : ... 
SELECT * 
{ ?z :hasHusband  ?p . 
    ?p :hasFirstName ?firstName ; 
     :hasLastName  ?lastName ; 
     :hasDateOfBirth ?dob ; 
    . 
} 

및 쿼리 onto.model.

관련 문제