CALL gds.graph.project('graphName', ['Label'], ['REL'])
→ Neo4j 원본 그래프에서 분석할 노드·관계를 골라 GDS 메모리 그래프로 투영한다.
CALL gds.graph.drop('graphName')
→ GDS 메모리에 만든 투영 그래프를 삭제하며 원본 Neo4j 데이터는 지워지지 않는다.
CALL gds.graph.list('graphName') YIELD nodeCount, relationshipCount
→ 현재 GDS에 올라온 투영 그래프의 노드 수와 관계 수를 확인한다.
{REL: {orientation: 'UNDIRECTED'}}
→ 원본 관계의 방향을 무시하고 GDS에서는 양방향 관계처럼 투영한다.
Degree = 연결이 많은가
CALL gds.degree.stream('graphName') YIELD nodeId, score
→ 각 노드의 연결 수, 즉 차수를 기준으로 중요도 점수를 계산한다.
PageRank = 중요한 노드와 연결됐는가
CALL gds.pageRank.stream('graphName') YIELD nodeId, score
→ 단순 연결 개수보다 중요한 노드에게 연결될수록 더 높은 점수를 주는 중심성이다.
Betweenness = 다른 노드 사이의 다리 역할을 많이 하는가
CALL gds.betweenness.stream('graphName') YIELD nodeId, score
→ 다른 노드들의 최단경로 사이에 얼마나 자주 위치하는지를 기준으로 중개 역할을 측정한다.
gds.util.asNode(nodeId)
→ GDS 알고리즘이 반환한 숫자형 nodeId를 실제 Neo4j 노드로 변환한다.
RETURN gds.util.asNode(nodeId).name AS name, score
→ 중심성 결과의 nodeId를 실제 노드 이름과 점수 형태로 확인한다.
{nodeLabels: ['Disease']}
→ 알고리즘 계산 대상을 특정 레이블 노드로 제한하며, 값 하나여도 리스트 형태로 전달해야 한다.
MATCH ()-[r:REL]->() RETURN count(r)
→ 원본 관계를 저장된 방향 기준으로 한 번씩 세어 실제 관계 수를 확인한다.
MATCH ()-[r:REL]-() RETURN count(r)
→ 방향을 무시해 관계를 매칭하므로 상황에 따라 같은 관계가 양쪽에서 잡혀 2배처럼 보일 수 있다.
WITH d, count(g) AS gene_count WHERE gene_count >= 100
→ 노드별 연결 수를 집계한 뒤 조건에 맞는 노드만 필터링한다.
RETURN gds.graph.project('graph', d, g, {...}, {undirectedRelationshipTypes:['*']})
→ MATCH로 골라낸 일부 노드와 관계만 Cypher 기반으로 GDS에 투영한다.
project → stream
→ 먼저 분석용 그래프를 만들고, 그다음 Degree·PageRank·Betweenness 같은 알고리즘을 실행한다.
GDS 투영은 만든 시점의 사본이라 원본 그래프가 바뀌어도 자동 갱신되지 않고, 변경사항을 반영하려면 drop 후 다시 project해야 한다.
중심성 지표
(1) pageRank - 모든 노드에서 중요한 노드를 선별
- 이웃의 점수로 내 점수가 결정이 된다 (중요한 이웃이 나를 가리키면 점수가 높아지진다. 중요한 이웃의 나가는 수 (외차수)가 작을수록 내 점수가 높아진다.)
(2) 개인화 pageRank - 기준 노드에서 중요한 노드를 선별
(3) 매개중심성 - 군집 사이의 길목에 위치한 노드를 선별