2015-01-19 4 views
0

Apache Jena의 Java API를 사용하여 문서 및 단어를 저장하고 검색합니다. 코드 예제는 위의 5 개의 단어로 구성된 문서 ("문서 A") ("aword")를 나타냅니다Apache Jena에서 집계하기

_dataset = TDBFactory.createDataset("./database"); 
_dataset.begin(ReadWrite.WRITE); 

Model model = _dataset.getDefaultModel(); 
Resource document= model.createResource("http://name.space/Source/DocumentA"); 
document.addProperty(RDF.value, "Document A"); 

Resource word = model.createResource("http://name.space/Word/aword"); 
word.addProperty(RDF.value, "aword"); 

Resource resource = model.createResource(); 
resource.addProperty(RDF.value, word); 
resource.addProperty(RSS.items, "5"); 

document.addProperty(RDF.type, resource); 

_dataset.commit(); 
_dataset.end(); 

:이를 위해 나는 다음과 같은 자료 구조를 설정하기로 결정했다. 문서에있는 단어의 수는 집계되어 속성으로 저장됩니다. 단어는 다른 문서에서도 발생할 수 있으므로 특정 문서의 특정 단어와 관련된 발생 횟수가 빈 노드에 의해 함께 연결됩니다. (나는이 구조가 정보를 저장하는 방법에 대해 상당히 새로운 것이므로 완전히 이해할 수 없다. 따라서 더 나은 해결책을 제공하는 것이 자유 롭다.)

나의 주요 질문은 : 모든 뚜렷한 단어의 목록과 모든 문서에 대한 출현 횟수의 합계?

답변

2

귀하의 데이터 모델은 다소 비 재정적입니다. 코드, 당신은 (거북이 표기)이 보이는 데이터와 끝까지, 그리고 RDF 사용하는 것입니다 : 유형RDF를 : 값을 틀에 얽매이지 않는 방법 :

:doc rdf:value "document a" ; 
    rdf:type :resource . 
:resource rdf:value :word ; 
      :items 5 . 
:word rdf:value "aword" . 

이 있기 때문에, 이례적인 일반적으로 자원의 유형 속성에 대한 복잡한 정보는 없습니다. 하지만 SPARQL 관점에서 보면 rdf :rdf : value은 다른 것과 마찬가지로 속성이며 간단한 쿼리로 원하는 정보를 검색 할 수 있습니다. 그것은 (당신이 어떤 접두사 등을 정의해야하지만) 이런 식으로 어느 정도 보일 것이다 : 즉, 쿼리가 각 단어에 대한 결과를 생성합니다

select ?word (sum(?n) as ?nn) where { 
    ?document rdf:type ?type . 
    ?type rdf:value/rdf:value ?word ; 
     :items ?n . 
} 
group by ?word 

, 그리고 각각의 모든의 합이 될 것입니다 의 값 : 단어와 관련된 속성. Stack Overflow에는 Jena로 SPARQL 쿼리를 실행하는 예제가 많이 있습니다. 예 : (Google에서 처음 발견 한) : Query Jena TDB store

+0

선택한 속성을 신경 쓰지 마라, 나는 단지 그것을 시험해보기를 원했던 바를 위해 좋은 것을 들려 주었다. 제안 된 SPARQL 쿼리에 관해서 : 저는 실제로 같은 것을 생각해 냈습니다. 단지 작동하지 않아서 뭔가 잘못하고 있다고 생각했습니다. 한편, 나는 그것이 작동하지 않는 이유를 발견했다 :'resource.addProperty (RSS.items, "5")'는 resource.addProperty (RSS.items, "5", XSDDatatype.XSDint)'로 변경되어야한다. 그렇지 않으면 쿼리의'SUM()'은 값을'String'으로 취하고 아무 것도 돌려주지 않을 것입니다. – manidu

+0

@manidu 예, 문자열을 추가 할 수 없습니다. 하지만 addProperty()보다는 [addLiteral] (https://jena.apache.org/documentation/javadoc/jena/com/hp/hpl/jena/rdf/model/Resource)을 사용하는 것이 더 편리 할 수 ​​있습니다. html # addLiteral (com.hp.hpl.jena.rdf.model.Property, long)), 이는 단지'addLiteral (RSS.items, 5)'일 것이다. 문자열이 전혀 없습니다. 실제 숫자입니다. –

관련 문제