본문 바로가기
Cloud SIEM 제작/Graph DB(Neo4j)

[Neo4j] Graph Data Science-네이티브 프로젝션(Native Projection)

by LIZ0904 2023. 1. 5.
반응형

네이티브 프로젝션이란?

GDS에는 네이티브 프로젝션과 사이퍼 프로젝션이라는 두 가지 프로젝션 유형이 있다.

네이티브 프로젝션 효율성과 성능에 최적화되어 대규모 그래프 데이터 과학을 지원
Cypher 프로젝션 탐색적 분석, 실험 및 더 작은 그래프 프로젝션을 지원하기 위해 유연성과 사용자 정의에 최적화

네이티브 프로젝션은 Neo4j 스토어 파일에서 직접 읽어 최고의 성능을 제공한다. 개발 및 생산 단계 모두에 적합하다.

* 사이퍼 프로젝션에 대한 글은 다음 게시글에 있다!

기본 프로젝션의 기능

- 노드 및 관계 요소를 그대로 프로젝션 하기

- 숫자 노드 및 관계 속성 포함하기

- 관계 방향 변경

- 병렬 관계 집계

위 기능들은 다양한 유형의 분석 워크 플로 및 알고리즘에 대한 투영을 준비하는데 도움이 된다.

 

기본 구문

이름 타입 필수 여부 설명
graphName string Y(필수) 그래프가 카탈로그에 저장되는 이름, 즉 그래프 이름
nodeProjection 문자열, 리스트, map Y(필수) 노드를 투영하기 위한 구성, 즉 그래프에 저장될 노드들
relationshipProjection 문자열, 리스트, map Y(필수) 관계를 예상하기 위한 구성, 즉 그래프에 저장될 관계
configuration map N(선택) 네이티브 프로젝션을 구성하기 위한 추가 매개변수
CALL gds.graph.project('native-proj',['User', 'Movie'], ['RATED']);

위 쿼리에서

graphName: native-proj

nodeProjection: User, Movie

relationshipProjection: RATED

이다.

 

CALL gds.graph.project('native-proj',['User', 'Movie'], 'RATED');

하나의 관계만 포함할 경우에는 리스트 형태가 아닌 단일 문자열 값으로만 넣어도 된다.

 

CALL gds.graph.project('native-proj','*', '*');

와일드카드 문자(*)를 사용해 모든 노드와 모든 관계를 포함할 수 있다.

관계 방향 변경

네이티브 프로젝션을 사용하면 관계 방향도 변경할 수 있다.

위는 방향성이 있는 관계이다. 즉, 서로 연관되고, 방향성이 있는 관계다.

 

 

위는 방향성이 없는 관계이다. 즉, 서로 대칭 관계이며, 단순히 두 노드는 같은 수준이다.

 

neo4j의 모든 관계는 설계를 어떻게 하냐에 따라 결정되지만, 몇개의 그래프 알고리즘은 무방향 관계에서만 작동하도록 설계되어 있다. 또한 원하는 분석을 하기 위해서는 관계의 방향을 반대로 바꿔야 할 때도 있다. 이를 위해 relationshipProjection 옵션을 사용한다


[relationshipProjection 옵션]

1. NATURAL: 데이터베이스에서와 같은 방향(기본값)

2. REVERSE: 데이터베이스에서와 반대 방향
3. UNDIRECTED: 무방향

 

CALL gds.graph.drop('native-proj', false);

//replace with a project that has reversed relationship orientation
CALL gds.graph.project(
    'native-proj',
    ['User', 'Movie'],
    {RATED_BY: {type: 'RATED', orientation: 'REVERSE'}}
);

CALL gds.degree.mutate('native-proj', {mutateProperty: 'ratingCount'});

위 쿼리에서

1. 기존에 있던 native-proj를 삭제

2. native-proj 이름의 프로젝트 생성, 노드는 User와 Movie, 관계는 RATED, 하지만 관계 옵션은 REVERSE를 주어 기존 데이터베이스와 반대 방향으로 관계 생성

3. 세번째 CALL은 무슨 의미이지 모르겠다 ㅎ

 

노드 및 관계 속성 포함하기

CALL gds.graph.drop('native-proj', false);

CALL gds.graph.project(
    'native-proj',
    ['User', 'Movie'],
    {RATED: {orientation: 'UNDIRECTED'}},
    {
        nodeProperties:{
            revenue: {defaultValue: 0}, // (1)
            budget: {defaultValue: 0},
            runtime: {defaultValue: 0}
        },
        relationshipProperties: ['rating'] // (3)
    }
);

위 쿼리는 다수의 Movie 노드의 속성과 rating 관계 속성을 포함하기 위한 예시이다.

- defaultValue: 위 매개변수를 사용하면 누락된 값은 기본 값으로 채울 수 있다. 이때 기본값은 0이다.

 

병렬 관계

두 노드 간에 동일한 유형 및 방향의 여러 관계를 저장할 수도 있다. 즉, 병렬 관계를 만들어 줄 수 있다. 

예를 들어, 위 사진처럼 금융 거래 시 병렬 관계를 만들 수 있다.

 

CALL gds.graph.project(
  'user-proj',
  ['User'],
  {
    SENT_MONEY_TO: { aggregation: 'SINGLE' }
  }
);

위 그림과 같은 병렬 관계를 만들기 위한 쿼리는 위와 같다.

반응형

댓글