빠른 트래버스를 위해 이런 종류의 그래프를 NEO4J에 저장하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/2421959

  •  19-09-2019
  •  | 
  •  

문제

노드의 관계는 한 번에 한 개의 에지 단지 존재할 수 있도록 노드의 관계가 에지 그룹의 모음이기 때문에 한 번에 많은 연결된 구성 요소에 노드가 존재하는 그래프입니다. 노드가 존재하는 모든 연결된 구성 요소를 찾을 수 있어야합니다. NEO4J 에이 그래프를 저장하는 가장 좋은 방법은 무엇입니까? 노드가 존재하는 모든 연결된 구성 요소를 신속하게 찾을 수 있습니까? 내장 트래버스를 사용하여이를 수행하는 방법이 있습니까?

또한 : 이런 종류의 그래프의 이름이 있습니까? 도움/아이디어에 감사드립니다.

업데이트:

명확하지 않아서 죄송합니다. 모든 노드는 동일한 유형입니다. 노드에는 가변 수의 에지 그룹이 있습니다. 특정 연결된 구성 요소에 대해 각 에지 그룹에서 정확히 하나의 모서리를 선택해야합니다. 예를 통해 설명하려고합니다.

Node x1 is related to: (x2 or x3 or x4) AND (x5 or x6) AND (x7)
Node x2 is related to: (x8) AND (x9 or x10)

따라서 X1의 첫 번째 에지 그룹입니다 (x2, x3, x4), 두 번째 에지 그룹입니다 (x5, x6), 그리고 세 번째 에지 그룹은입니다 (x7).

여기에는 몇 가지 연결된 구성 요소가 있습니다 x1 insists :

CC1 :

x1 is related to: x2, x5, x7
x2 is related to: x8 x9 

CC2 :

x1 is related to: x2, x6, x7
x2 is related to: x8, x9

CC3 :

x1 is related to: x3, x5, x7

CC4 :

x1 is related to: x3, x6, x7

등.

이것에 대한 당신의 도움에 감사드립니다.

Update2 :

이 질문에 대한 답이 있다면 이렇게 할 수 있다고 생각합니다.NEO4J와의 트래버스의 모든 단계에서 현재 노드의 함수로 사용할 관계 유형을 어떻게 지정할 수 있습니까?

도움이 되었습니까?

해결책

그들은 당신의 질문을 이해하는 방식으로 여러분이 여러 노드를 가지고 있습니다. X 노드, 많은 유형 노드 (또는 유사한 것)에 연결된 경우이 노드를 호출합시다. T 노드. x 노드는 여러 t 노드에 연결할 수 있지만 각 t 노드에 대한 하나의 연결 또는 각각의 하나의 연결 만 가능합니다. 친절한 t 노드 (설명은 여기에 약간 퍼지입니다).

내가 이것을 모델링하는 방식은 각 (종류) t 노드에 하나의 관계형을 사용하는 것입니다. 그런 다음 x_node.getRelationships (t_type_one, t_type_two, ... 등)를 사용하여 모든 t 노드를 x 노드에서 가져올 수 있습니다. x 노드를 돌연변이 할 때 각 (각각의) T 노드와 최대 한 가지 관계를 가질 수있는 불변을 유지 해야하는 곳입니다. x_node.getSinglerelationship (the_t_type_youre_mutating)을 사용 하여이 작업을 수행하면 NULL을 반환하면 해당 유형의 새로운 관계를 추가하는 것이 안전합니다. 관계를 반환하면 새 관계를 추가하기 전에 제거해야합니다.

이 모델의 Ascii-Art 예제 (해석대로) :

(x1)--T_ONE-->(t1a)   (t1b)<--T_ONE--(x2)--T_FOUR-->(t4a)
 |\                                   |
 \ |---T_TWO-->(t2a)                 /
  \                                 /
   |---T_THREE-->(t3a)<--T_THREE---/

위의 예에서 두 x 노드는 T_one 구성 요소의 일부이지만 X1은 T_ONE 구성 요소 T1A의 일부이고 X2는 T1B의 일부입니다. 그것들은 둘 다 t_three 구성 요소 T3a의 일부이며, X1은 t_two 구성 요소 T2A의 일부이고 X2는 t_four 구성 요소 T4A의 일부입니다. 이 예제에서 쿼리는 다음과 같습니다.

Iterable<Relationship> x1_comps = x1.getRelationships(T_ONE, T_TWO, T_THREE, T_FOUR);
Iterable<Relationship> x2_comps = x2.getRelationships(T_ONE, T_TWO, T_THREE, T_FOUR);

업데이트는 다음과 같습니다.

void setComponent(Node xNode, RelationshipType tType, Node tNode) {
    Relationship current = xNode.getSingleRelationship(tType);
    if (current != null) current.delete();
    xNode.createRelationshipTo(tNode, tType);
}

귀하의 요구 사항을 잘못 해석 한 경우 알려 주시면 업데이트 된 설명을 찌르기 위해 기꺼이 기꺼이하겠습니다.

다른 팁

다른 쿼리와 관련하여, 나는 훌륭한 입자 기능에 대한 몇 가지 가능성을 지적했습니다. NEO4J와의 트래버스의 모든 단계에서 현재 노드의 함수로 사용할 관계 유형을 어떻게 지정할 수 있습니까?기본적으로 Traverser를 사용하지 말고보다 직접적인 노드 .getRelationship* API를 사용하고 미세한 곡물 제어를 위해 고유 한 반복을 구축하십시오.

그것이 당신의 문제를 해결합니까?

/Peter Neubauer

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top