2017-03-07 17 views
0

Neo4j에 중첩 트리가 저장되어 있습니다. 각 노드는 다른 노드와 (n)-[:CHILD]->(c) 관계를 가질 수 있습니다. 지정된 노드의 전체 트리를 MATCH (n)-[c:CHILD*]-(m)으로 쿼리 할 수 ​​있습니다.중첩 계층을 통해 사용자 순회 경로 저장

내가 문제를 겪고있는 것은 사용자가 나무를 걷는 경로를 저장하는 방법을 알아내는 것입니다. 예를 들어 경로를 반환하는 쿼리는 (user)-[:USER_PATH*]->(node)입니다.

그러나 경로는 :CHILD 행의 라인을 따라 있어야하며 분기 외부로 이동할 수 없습니다. 사용자 경로는 첫 번째 분기의 잎에서 다른 분기의 잎으로 점프 할 수 없습니다. 경로를 따라 내려 오는 분기점을 발견 할 때까지 원래 경로로 되돌아 가지 않습니다.

또한 최단 경로가 작동하지 않을 것이라고 생각합니다. 왜냐하면 최단 경로가 아니기 때문에 사용자의 실제 경로를 원하기 때문입니다. 그러나 사용자가 어떤 지점에서 물러 섰을 때 포기 된 관계는 무시해야합니다. 죽은 길을 떠나지 않아야합니다.

각 노드를 걸어 둔 후에 그래프를 업데이트하여 이러한 규칙이 그대로 유지되도록하려면 어떻게해야합니까 ??

새 분기로 드릴 다운 할 때 한 번 더 형제 집합으로 이동할 수 있다고 가정 할 수 있습니다. 그러나 그것이 나왔던 모든 가지들은 여전히 ​​열려 있기 때문에 형제들을 선택할 수 있습니다.

내가 이해할 수있는 최저은 할 필요가 있다는 것입니다 :만큼 그것을 할 수있는

  • :USER_PATH 관계를 걸어 "선호"
  • 이 새 노드에 도착하는 경로를 중단 할 필요까지
  • 에서
  • 는 새로운 관계
  • 그 경로에 더 이상 이전의 모든 관계를 삭제를 생성 지적

나는 그것을 어떻게 성취 할 것인지 잘 모른다.

나는 시행 착오와 엄청나게 많은 시간을 들여 아무 소용이 없었습니다.

미리 감사드립니다. 아래 그림을 감안할 때


:

  • 빨간색 노드 = 사용자
  • 녹색 노드가 유효한 노드를 = 새로운 "대상"
  • 블루 노드 = 유효하지 않은 대상 노드가 될

그래서 현재 리프 노드에서 벗어나면 체인의 최종 : RATIONAL_PATH 관계가 삭제됩니다.

또한 경로는 선택된 녹색 노드 중 하나에 맞춰야하지만 기존 : RATIONAL_PATH는 가능한 한 그대로 유지해야합니다.

enter image description here

+0

저는 RATIONAL_PATH 관계가 경로가 될 것으로 예상되는 경로 또는 생성 될 것으로 예상되는 경로 ...에 대해 다소 모호합니다. 이러한 개별 관계는 다른 종류의 프로세스에 의해 선택됩니까? 아니면 당신이 어떻게''MATCH (n) - [c : CHILD *] - (m) 종류의 질의로부터 그들을 추측하려합니까? – InverseFalcon

+0

원하는 최종 결과는 단일 경로입니다. RATIONAL_PATH 어떤 끝 노드와의 관계이며 사용자가 탐색했지만 반환 된 경로를 정리하는 방법이 필요합니다. 그게 네가 쫓아 온거야? 나는 후진 프로세스가 생성 될 것이라고 가정하고있다. RATIONAL_PATH 관계는 이전 노드로 되돌아 오는 방향으로 (그들이 왔던 방향과 반대 방향으로) 연결된다. 어떤 시점에서 외부 경로를 정리하려고합니까? – InverseFalcon

+0

예, 단일 경로 : 루트 노드에서 트리의 일부 노드까지의 RATIONAL_PATH 경로. 그러나 탐색 할 때 반대 방향으로 돌아가는 것보다는 루트에서 대상으로의 단방향 경로를 제공하기 위해 관계를 삭제하는 것이 좋을 것입니다. 그 관계를 삭제하는 것이 좋습니다. 우선 첫째로. –

답변

0

는 개인적으로 기존 경로를 제거하고 shortestPath()과 새를 만드는 것은 아마 갈 수있는 가장 좋은 방법이라고 생각합니다. 기존 경로를 재사용하고 정리를 수행하는 비용은 처음부터 다시 시작하는 것보다 훨씬 더 복잡 할 수 있습니다.

그렇지 않으면 취할 접근법은 경로의 마지막 노드까지 일치시킨 다음 새 노드에 shortestPath()를 수행하고 경로를 생성하는 것입니다.

그런 다음 정리를 수행해야합니다. 여기에는 모든 경로를 일치시키는 RATIONAL_PATH 관계가 포함됩니다. 가장 짧은 거리를 가진 사람이 우리가 지키는 사람이 될 것입니다. 우리는 이러한 관계를 수집하고, 더 이상 유효하지 않은 다른 경로의 다른 관계를 수집하고, 가장 짧은 경로에서 사용되지 않는 관계를 얻기 위해 일부 빼기를 수행하고, 삭제해야합니다.

대단히 피해야 할 작업입니다.

+0

지금 당장은 기본적으로 다음과 같습니다. 모두 삭제 : 해당 노드에 대해 RATIONAL_PATH를 완전히 삭제합니다. 최단 경로를 찾고, 각각 사이의 RATIONAL_PATH; –