2012-06-27 3 views
2

저는 지금 Neo4j를 조금 사용해 왔습니다. Neo4j를 사용하여 실행 중이며 모두 잘 작동하며 Neo4j는이 문제를 해결하는 데 정말 멋졌습니다.하지만 지금은 앱을 확장하고 impl하려고했습니다. Key-Value Neo4j에 대한 데이터 목록이며 가장 좋은 방법은 아닙니다.Neo4j 키 - 값 목록 권장 구현

나는 목록을 가지고 있는데, 목록은 길이가 약 7 백만 요소이며 전체 목록을 메모리에 저장하고 직접 관리하기위한 것입니다. 나는 이것을 테스트했고 3Gb를 소비 할 것이다.

  • 의 (a) Neo4j는 작업에 대한 엉뚱한 도구이며 내가 실제 키 - 값 데이터 저장소를 사용해야합니다

    내 선택 중 하나입니다. 이 데이터 목록을 위해 다른 데이터 저장소를 도입해야하기 때문에 약간 불리한 점이 있습니다.

  • (b) 키 - 값 설정 노드 당 키와 값을 노드의 등록 정보로 설정하여 Neo4j를 사용하지만이 노드를 함께 그룹화하는 인덱스가없는 관계가 없으므로 키의 키가 노출됩니다 인덱스의 키로 값.
  • (c) 단일 노드를 만들고 모든 키 - 값을 속성으로 유지하면 노드를 가져올 때 모든 것을 메모리에로드 할 것이므로 노드의 속성을 검색해야하므로 잘못되었습니다. 나는 관심을 가지기 때문에 목록을 직접 관리 할 수도 있습니다.
  • (d) 키는 실제로 두 노드를 가리키는 두 부분 키이므로 관계를 만들고 관계의 속성으로 값을 설정합니다. 필자는이 경로를 시작했지만 특정 키/값에 대한 조회를 수행 할 때 간단하고 빠르지 않으므로 여기에서 배제해야합니다.

'a'또는 'b'옵션 중 하나를 선택하십시오.
조언을 주시면 감사하겠습니다.

시나리오 예

우리는 노드 A와 두 노드 사이의 관계를 가지고 노드 B가있다. 노드는 모두 'foo'속성을 가지고 있으며 foo는 어떤 값을 가지고 있습니다. 이 예제에서 노드 A는 foo = X이고 노드 B는 foo = Y를 가지고 있습니다

다음 K/V 목록이 있습니다. 그 K/V 중 하나가 Key : X + Y = Value : Z 그래서 원래 아이디어는 노드 A와 노드 B 사이에 또 ​​다른 관계를 만들고 관계를 Z로 유지하는 속성을 저장하는 것이 었습니다. 그런 다음 'foo '와 새로운 관계에 대한 관계 idx.

키가 주어진 경우 X + Y 값을 얻습니다. 조회 논리는 노드 A (X에서)와 노드 B (y에서)를 얻은 다음이 새로운 관계 유형에 대해 노드 A 관계를 노드 B 찾아보기로 이동합니다. 이것이 효과적 일지 모르겠지만 특정 유형을 찾고있는 노드와의 모든 관계를 통해 조회해야한다는 사실은 비효율적입니다. 특히 여러 유형의 관계가 많은 경우.

그래서 'A'또는 'B'옵션을 사용하여 결론을 내리거나, 네오와 비현실적인 것을하려고합니다.

답변

1

Neo4j 속성에 700 만 가지 항목을 저장하지 마십시오. 맞습니다.

Redis와 Neo4j는 종종 좋은 쌍을 이루지 만, 당신이하려고하는 것이나 "d"에서 무엇을 의미하는지 이해하지 못합니다 - 키/값 쌍은 무엇이며 어떻게 관련되어 있습니까? 그래프의 노드와 관계에? 예제가 도움이 될 것입니다.

업데이트 : 그래프 데이터베이스로이를 수행하는 가장 자연스러운 방법은 두 노드 사이의 가장자리에 속성으로 저장하는 것입니다. 그런 다음 Gremlin을 사용하여 그 가치를 얻을 수 있습니다.

예를 들어, 일부 속성이 두 정점 (노드) 사이에 존재하는 가장자리에 속성을 반환 : 당신이 제안처럼

start = g.idx('vertices')[[key:value]]   // start vertex 
edge = start.outE(label).as('e')     // edge 
end = edge.inV.filter{it.someprop == somevalue} // end vertex 
prop = end.back('e').prop       // edge property 
return prop 

당신은 인덱스에 저장할 수 있습니다,하지만이 더 복잡해 데이터를 참조하는 경우 트래버스의 일부로 데이터를 참조해야하는 경우 트래버스 할 때 중복 데이터를 저장하거나 Redis에서 조회해야합니다. 수행 할 수있는 작업은 다음과 같습니다.

Have Gremlin 그래프를 보면서 실시간으로 Redis와 대화하십시오. https://groups.google.com/d/msg/gremlin-users/xhqP-0wIg5s/bxkNEh9jSw4J

업데이트 2 : 정점 ab의 ID가 미리 알려진 경우

은, 그것은 심지어 쉽게 : 정점 ab이 미리 알려져있다

g.v(a).outE(label).filter{it.inVertex.id == b}.prop 

경우, 그것의 :

a.outE(label).filter{it.inVertex == b}.prop 
+0

노드 A와 노드 B가 있고 노드 A와 B 사이에 관계가 있습니다. 이것은 주어진 것입니다. –

+0

질문에 대한 추가 내용보기 –

+0

원래 두 개의 노드 사이에 가장자리를 찾는 방법 때문에 원래는 그걸 막아 냈습니다. 노드 A가 시작점이고 노드 B가있는 에지와 노드 C가있는 에지가 있지만 탐색의 시작/종료 노드가 미리 알려지면 i, e, A에서 B까지이 에지를 얻는 방법 노드 A에서 C 사이의 가장자리를보고 있습니다.이 작업을 수행하는 유일한 방법은 유형 A의 모든 관계를 가져 와서 B와 일치 할 때까지 각 가장자리의 대상 노드를 확인하는 것입니다. 많은 다른 노드는 비쌀 수 있습니다. 또는 나는 무엇인가 놓치고 있냐? –