네이티브 프로젝션이란?
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' }
}
);
위 그림과 같은 병렬 관계를 만들기 위한 쿼리는 위와 같다.
'Cloud SIEM 제작 > Graph DB(Neo4j)' 카테고리의 다른 글
[Neo4j] Graph Data Science-그래프 알고리즘(Graph Algorithms) (0) | 2023.01.05 |
---|---|
[Neo4j] Graph Data Science-사이퍼 프로젝션(Cypher Projection) (0) | 2023.01.05 |
[Neo4j] Graph Data Science-그래프 카탈로그(Graph Catalog) (0) | 2023.01.04 |
Neo4j Graph Data Science(GDS) 개요 (0) | 2023.01.04 |
Neo4j 사이퍼 쿼리 (0) | 2023.01.03 |
댓글