2012-05-15 3 views
4

큰 데이터 집합에서 동적으로 생성 된 내용의 Neo4j 데이터베이스가 있습니다.Neo4j 색인의 모든 키 얻기

모든 "진입 점"노드는 named index (IndexManager.forNodes(…))으로 인덱싱됩니다. 따라서 특정 "진입 점"노드를 찾을 수 있습니다.

그러나 이제 모든 특정 노드를 열거하지만 어떤 키를 인덱싱했는지 알 수 없습니다..

Neo4j Index의 모든 키를 열거 할 방법이 있습니까?

그렇지 않은 경우, 그 키를 저장하는 가장 좋은 방법은 무엇입니까?이 데이터 유형은 탁월하게 그래프 지향적이지 않습니까?


UPDATE (덕분에 세부 사항을 :) 요청에 대한) : 목록 2 개 백만 개 이상의 항목이 될 것이다. 주요 사용 사례는 초기화 단계 이후에 업데이트하지 않는 것이지만 다른 사용 사례에서는이를 필요로하므로 다소 확장 가능해야합니다.

또한 현재의 내재적 인 능력을 죽이지 않으므로 한 번에 모든 키를 저장하는 것이 좋습니다. 점진적으로 추가하는 것과는 달리 최후의 수단이 될 것입니다.

+0

이 이제까지 해결되었다 얻을 특히 다음 노드로 연결이 키 통과 케이스에 대한 모든 노드에 특별한 "참조"필드? –

+0

@MattLuongo 답변에 제공된 해결 방법을 시도 할 시간이 없었습니다. 그러나 절대로 "깨끗한"대답은 없었습니다. – MattiSG

+0

BTW,이 질문에 대한 프로젝트는 [SemWiktionary] (https://github.com/MattiSG/SemWiktionary)입니다. 단지이 질문 이후에 어떤 사람들은 질문에 그 세부 사항을 포함시키는 것이 좋은 예의라고 배웠기 때문입니다. – MattiSG

답변

0

하나의 키 목록입니까, 노드 당 하나의 목록입니까? 특정 노드 (예 : 참조 노드)에 이러한 목록을 저장할 수 있습니다.

+0

하나의 키 목록입니다. 2 백만 개 이상의 열쇠. node [properties] (http://docs.neo4j.org/chunked/1.6.2/graphdb-neo4j-properties.html) 허용 된 유형이 프리미티브 (primitives)를 고려할 때, 어떻게 한 노드에 그러한 목록을 저장할 수 있는지 모르겠다. + String ... 엔트리마다 인덱스 된 속성을 추가하는 것보다 더러운 것을 제외하는 것입니다. – MattiSG

+0

@MattiSG 노드 속성은 당신의 필요를 만족시키는'String []'배열을 저장할 수 있습니다. 다른 접근법에 대해서는 보류중인 대답을 참조하십시오. –

+1

@MattLuongo 오, 네 말이 맞아, 속성도 원시적 일 수 있다는 걸 잊어 버렸어. ** array ** : -S 2M 배열을 속성으로 저장하면 성능에 미치는 영향에 대해 알고 있니? 스토리지가 어떻게 처리되는지는 모르겠지만 그러한 문자열 배열은 분명히 압축의 이점을 얻게 될 것이고 구현이 어려울 것입니다 ... – MattiSG

1

다른 데이터 저장소를 사용하여 Redo를 좋아하거나 MattiasPersson의 제안을 시도하여 노드에 목록을 저장합니다. 특정 인덱스에서 인덱스 된 모든 노드를 얻고 싶은 경우에

+0

추가 데이터 저장소를 사용해야하는 경우, 어쩌면 멍청한 텍스트 파일이나 일부 직렬화로 이동하여 다른 본격적인 데이터베이스 라이브러리를 추가해도 과도한 느낌이들 것입니다. 그러나 제안에 감사 드리며, 최근에 자주 돌아 오는 Redis를 살펴 보겠습니다. – MattiSG

+0

또한 목록이 거의 변경되지 않는 경우 텍스트 파일을 찾아 메모리에로드하고 종료 또는 주기적으로 또는 그와 같은 추악한 내용을 쓸 수 있습니다. 2M String []은 그다지 훌륭하지 않습니다. 말하라. String [] 속성과 같은 배열을 저장 /로드하려고 시도 했습니까? –

+0

매우 드물게 변경되어야합니다. 주요 유스 케이스는 ... init 이후에는 절대 안됩니다. 하지만 끔찍한 성능없이 추가 할 수있는 가능성을지지해야합니다. 아니, 아직 시도하지 않았지만 현재 꺼져 있습니다. 약 10 일 후에 시험해 볼게. – MattiSG

-1

, 당신은 다만 할 수 있습니다

IndexHits<Node> hits = IndexManager.forNodes(<INDEX_NAME>).query("*:*"); 
try{ 
    while(hits.hasNext()){ 
     Node n = hits.next(); 
     ...process the node... 
    } 
}finally{ 
    hits.close(); 
} 
+1

아니요. 사실, 그게 내가 한 일 이었어. 2M이 너무 크면 OutOfMemory 예외와 끔찍한 성능을 얻을 수 있습니다. - (downvote에 대해 유감 스럽지만, 향후 독자에게는 이것이 해결책이 아님이 분명해야합니다) – MattiSG

0

대신 complexety 당신이

    다시 시도 할 수 증가는 다른 스토리지를 사용하는
  1. lucene indices. 일반적으로 lucene은 이것을 쉽게 처리 할 수 ​​있습니다. 특히 MatchAllDocsQuery가 더 좋았습니다. 그러나 하나의 문제는 neo4j 녀석들이 아주 오래된 lucene 버전을 사용하고 있다는 것입니다.

  2. 쉽게 ALL 속성 :