특정 노드가 어떤 방식 으로든 연결된 전체 하위 그래프를 찾기위한 Gremlin 쿼리

Aug 19 2020

저는 Gremlin을 처음 접했으며 gremlin-python그래프를 탐색 하는 데 사용 하고 있습니다. 그래프는 내부적으로 연결된 많은 클러스터 또는 하위 그래프로 구성되며 그래프의 다른 클러스터와 상호 연결되지 않습니다.

이에 대한 간단한 예는 5 개의 노드와 3 개의 간선이있는 그래프입니다.

  • Customer_1가장자리 CreditCard_A와 연결1_HasCreditCard_A
  • Customer_2가장자리 CreditCard_B와 연결2_HasCreditCard_B
  • Customer_3가장자리 CreditCard_A와 연결3_HasCreditCard_A

쿼리 된 노드에 연결된 모든 노드 및 가장자리 (인 / 아웃)의 하위 그래프 개체를 반환하는 쿼리를 원합니다. 그런 다음이 하위 그래프를 변수로 저장 한 다음 다른 순회를 실행하여 다른 것을 계산할 수 있습니다.

이 쿼리는 여러 클러스터 (내부 또는 외부)가 서로 멀리 떨어져있는 노드로 구성 될 수 있으므로 재귀 적이어야합니다. 또한 다양한 유형의 노드와 에지가 있으며 모두 반환되어야합니다.

예를 들면 :

  • 내가 지정한 경우 Customer_1쿼리에서, 결과 하위 그래프가 포함됩니다 Customer_1, Customer_3, CreditCardA, 1_HasCreditCard_A,와 3_HasCreditCard_A.
  • 내가 specififed 경우 Customer_2, 반환 된 하위 그래프로 구성 것이다 Customer_2, CreditCard_B, 2_HasCreditCard_B.
  • 쿼리 Customer_3하면 Customer_1쿼리 에서 반환 된 것과 똑같은 하위 그래프 개체 가 반환됩니다.

Cypher와 함께 Neo4J를 사용하고 GraphQL과 함께 Dgraph를 사용했으며이 두 언어에서이 작업이 매우 쉽다는 것을 알았지 만 gremlin을 이해하는 데 조금 더 어려움을 겪고 있습니다.

편집하다:

,에서 이 질문에 선택한 대답은 내가 무엇을 원하지만 변경하여 에지 형을 지정하지 않고 달성해야 .both('created')만에 .both().

그러나 루프 구문 : .loop{true}{true}은 물론 파이썬에서는 유효하지 않습니다. 이 루프 기능을 사용할 수 gremlin-python있습니까? 아무것도 찾을 수 없습니다.

편집 2 :

나는 이것을 시도했고 예상대로 작동하는 것 같습니다.

g.V(node_id).repeat(bothE().otherV().simplePath()).emit()

이것이 내가 찾고있는 것에 대한 유효한 해결책입니까? 이 결과에 쿼리 된 노드를 포함 할 수도 있습니까?

답변

2 noam621 Aug 20 2020 at 13:51

두 번째 편집과 관련하여 이것은 시작 정점에 연결된 모든 정점을 반환하는 유효한 솔루션처럼 보입니다. 몇 가지 작은 수정 사항 :

  • 당신은을 변경할 수 있습니다 bothE().otherV()both()
  • 시작 정점도 얻으려면 emit이전 단계 를 이동 해야합니다.repeat
  • dedup모든 중복 정점을 제거 하는 단계를 추가합니다 (정점에 대한 경로가 둘 이상일 수 있음)
g.V(node_id).emit().repeat(both().simplePath()).dedup()

예 : https://gremlify.com/jngpuy3dwg9