2016-10-05 1 views
0

나는이 같은 모델을 이해 :
는 세 쌍둥이로 구성 (제목 술어/속성 개체)Apache Jena에서 모델 데이터 (또는 그래프)의 정확한 구현은 무엇입니까?

ABC
CDE
EFG
GHI
XYZ

그리고 우리의 위에서 나타낼 수 그래프에서 노드와 가장자리가있는 삼중 항.
모델에서 C-> E-> G-> I와 같은 체인을 가질 수있는 Subject 'A'값을 가져 오려면 'C'노드에서 SubGraph를 반환해야합니다.

여기 내 재귀 코드 :

public Model getRecursive(String subject) { 
    Model newModel = ModelFactory.createDefaultModel(); 

    StmtIterator it = this.model.listStatements(); 
    while (it.hasNext()) { 
     Statement statement = it.next(); 
     if(statement.getSubject().toString().equals(subject)) 
     { 
      newModel = newModel.add(statement); 
     } 
    } 

    Model objectModel = ModelFactory.createDefaultModel(); 
    it = newModel.listStatements(); 

    while (it.hasNext()) { 
     Statement statement = it.next(); 
     objectModel = objectModel.add(getRecursive(statement.getObject().toString())); 
    } 

    newModel = newModel.add(objectModel); 

    return newModel; 
} 

하지만 내 문제는 복잡성이 너무 높은 것입니다.
모델에 1000 개의 세 쌍이 있고 제목에 'A'의 체인 길이가 10이라고 가정합니다. 내 코드에 따르면 각 호출에 대한 재귀 코드가 전체 세 쌍을 반복하여 현재 주어진 주체와 쌍을 이루기 때문에 시간 복잡도는 10 * 1000입니다. 그리고 나서 Object 값을 재귀 적으로 호출합니다.

빨리 할 수있는 다른 방법이 있습니까? 나는 그래프와 모델에서 어떤 메소드도 얻지 못했다.

+0

이 작업에 SPARQL을 사용 해본 적이 있습니까? – AndyS

+0

1) StmtIterator sIter = model.listStatements (subject, null, (RDFNode) null) 2) SPARQL 질의 SELECT * WHERE {? 술어? }.이 두 문장은 같은 결과를 줄 것입니다. 둘 다 동일한 시간이 걸리겠습니까? – Badman

답변

1

예나 모델은 색인이 생성되어 있으므로 사물을 찾기 위해 스캔 할 필요가 없습니다.

Resource subject = model.getResource(uristring) ; 

다음 어큐뮬레이터 전달 : 자원이 아닌 문자열

첫째, 작업

Model acc = ModelFactory.createDefaultModel(); 

지금과 같은 결과를 모든 시간을 복사 할 수 없습니다.

recurse(Resource start, Model acc) ; 

당신이 찾고있는 무엇으로 인수를 listStatements(s,p,o)를 사용하는 모델에 액세스 할 수 있습니다.

StmtIterator sIter = model.listStatements(subject, null, (RDFNode)null) ; 

해당 주제와 관련된 진술 만 찾습니다. 자원에 대한 방법 등으로까지 포장되어

:

StmtIterator sIter = subject.listProperties() ; 

(subject 그것에서 어떤 모델을 알고있다).

또한주기를 확인해야합니다. 그렇지 않으면 반복됩니다.

+0

"Jena 모델의 색인이 생성되었습니다"라는 메시지가 표시되지 않았습니다. 해시 맵이 구현 되었습니까? StemtIterator에 대한 복잡성은 무엇입니까? model.listStatements (subject, null, (RDFNode) null) 및 StmtIterator sIter = model.listStatements (null, prop, (RDFNode) null)? O (n) 또는 O (1) 또는 O (log (n))? – Badman

+0

자원이 비어있는 경우 노드 노드?리소스 주제 = model.getResource (blankNodeString) .StmtIterator sIter = model.listStatements (subject, null, (RDFNode) null); 이것은 공백 노드가 자원 인 방법으로는 작동하지 않습니다. – Badman

+0

빈 노드의 이름이 없습니다. 어떻게 든 출발점을 찾아야합니다. 그 후 "createResource"는 사용되지 않습니다. 빈 노드는 Resources로 전달됩니다. – AndyS

관련 문제