728x90
반응형
  • Cypher & GQL

이 글은 게스트 블로그 포스팅이에요. 아밋 굽타님이 Neo4j 토론 포럼에서 나눈 이야기를 바탕으로 작성되었답니다.

친구의 친구를 소개해 줄 사람 찾기

제가 풀었던 재미있는 문제가 하나 있었는데요, 바로 Facebook 같은 그래프 네트워크에서 2촌 친구(친구의 친구)를 소개해 줄 수 있는 1촌 친구(친구) 목록을 찾는 거였어요.

예를 들어, 'X'와 'Y'라는 친구가 있고, 'Z'가 그들의 공통 친구라고 가정해 볼게요. 저는 모든 2촌 친구(예: Z)를 `Query`하고, 모든 1촌 친구 목록을 반환받고 싶은 거죠. 이 경우 출력은 ["X", "Y"]여야 해요. 이 목록이 바로 제 친구의 친구에게 저를 소개해 줄 수 있는 사람들이 되는 거죠. 이걸 수행하는 Cypher `Query`를 보여드리기 위해, 예제 그래프 설정이 포함된 아래 Neo4j 데모 콘솔을 한번 살펴볼까요?

START joe=NODE:node_auto_index(name = “조”) MATCH joe–[:KNOWS]->friend–[:KNOWS]->friend_of_friend WHERE NOT(joe–[:KNOWS]–friend_of_friend) RETURN collect(friend.name), friend_of_friend.name

이 쿼리는 다음을 반환해요.

collect(friend.name), friend_of_friend.name
[빌, 사라] 이안
[빌] 데릭
[사라] 질

일괄 가져오기 중에 자동 인덱싱을 지원하기 위한 Index 생성

neo4j.properties에서 자동 인덱싱이 활성화되면 생성된 각 Node가 node_auto_index라는 Index에 추가된다는 것을 알고 있죠? 이제 멋진 부분이 있어요. (일괄 가져오기 시) 원본 수동 Index를 추가하고 이름을 node_auto_index로 지정하면 Neo4j에서 자동 인덱싱을 활성화하면 일괄 삽입된 Node가 자동 인덱싱된 것처럼 나타나요. 그리고 이후부터 Node를 생성할 때마다 해당 Node도 인덱싱될 거예요.

Node를 생성하고 Cypher를 통해 Index에 Node를 추가합니다.

제 문제는 간단했어요. Node를 Graph Database로 일괄 가져오고 Index를 생성했는데, 이제 그래프에 새로 추가된 Node에 대해 Index에 추가하고 싶었던 거죠. 이 모든 작업은 Cypher를 통해 수행되어야 했어요. 아쉽게도 현재 Cypher에서는 지원되지 않아요. 해결 방법을 생각했는데 아래에서 설명할게요.

예를 들어 그래프에 가져온 Node가 여러 개 있고 Index가 node_auto_index라고 가정해 볼게요. 또한 neo4j.properties에서 name을 인덱싱 가능한 Property로 선언했어요. 이제 다음을 수행할 수 있어요.

CREATE n = {name: 'xyz', …} RETURN n;

그러면 'xyz'라는 이름의 Node가 생성돼요. 이 Node가 실제로 인덱싱되었는지 확인하려면 다음 Query를 실행하면 돼요.

START root= node:node_auto_index('name:xyz') RETURN root;

Viola, 방금 생성한 Node도 자동으로 인덱싱되었음을 알 수 있어요!


에이치시스템즈의 LogTree는 Neo4j 기반 GraphRAG 플랫폼으로, 데이터를 자동으로 지식그래프화하고 자연어 질의로 즉시 답을 제공합니다.

👉 에이치시스템즈 홈페이지

728x90
반응형

+ Recent posts