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

[Neo4j] Graph Data Science-사이퍼 프로젝션(Cypher Projection)

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

GDS에는 네이티브 프로젝션과 사이퍼 프로젝션이라는 두 가지 프로젝션 유형이 있다. 이번에는 사이퍼 프로젝션에 대해서 공부해보자!

 

 

https://liz09045.tistory.com/153

 

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

네이티브 프로젝션에 대하여 네이티브 프로젝션은 Neo4j 스토어 파일에서 직접 읽어 최고의 성능을 제공한다. 개발 및 생산 단계 모두에 적합하다. [기본 프로젝션의 기능] - 노드 및 관계 요소를

liz09045.tistory.com

네이티브 프로젝션에 대한 내용은 이전 게시글에서 확인할 수 있다.

 

사이퍼 프로젝션이란?

- 장점

네이티브 프로젝션은 확장가능하고 빠른 반면, cypher 프로젝션은 필터링 및 집계 기능에서의 유연성을 보여준다. 이름에서도 알 수 있듯이 cypher를 사용해 프로젝션 패턴을 정의하므로 더 많은 유연성을 제공한다.

1. MATCH/WHERE 조건을 사용해 더 복잡한 필터링을 수행할 수 있다.

2. 가중치를 사용하여 다중 홉 경로를 집계할 수 있다.

3. 네이티브 프로젝션보다 더 많은 사용자 지정 및 유연성을 제공한다.

 

- cypher projection의 사용

1. 추가적인 유연성이 필요할 때

2. 사용자 지정이 필요한 탐색적 분석 및 개발 단계에서 사용

3. 상대적으로 작은 커뮤니티 또는 이웃 노드와 같이, 그래프의 작은 부분만 하위 집합으로 만들 때

 

 

기본 구문

사이퍼 프로젝션은 graphName, nodeQuery, relationshipQuery 세가지 필수 인자를 사용한다. 또한 configutaion 선택 인자를 추가로 사용할 수 있다.

 

이름 필수여부 설명
graphName Y(필수) 그래프가 카탈로그에 저장되는 이름
nodeQuery Y(필수) - 프로젝트 노드에 대한 Cypher 문
- 쿼리 결과에는 id열이 포함되어야 함
- 선택적으로 노드 레이블을 나타내는 labels 열을 지정할 수 있음
relationshipQuery Y(필수) - 프로젝트 관계에 대한 Cypher 문
- 쿼리 결과에는 source및 target열이 포함되어야 함
- 선택적으로 type관계 유형을 나타내는 열을 지정할 수 있음
configutaion  N(선택) Cypher 프로젝션을 구성하기 위한 추가 매개변수

 

사용법

CALL gds.graph.project.cypher(
  'proj-cypher',
  'MATCH (a:Actor) RETURN id(a) AS id, labels(a) AS labels',
  'MATCH (a1:Actor)-[:ACTED_IN]->(m:Movie)<-[:ACTED_IN]-(a2)
   WHERE m.year >= 1990 AND m.revenue >= 1000000
   RETURN id(a1) AS source , id(a2) AS target, count(*) AS actedWithCount, "ACTED_WITH" AS type'
);

위와 같이 사이퍼를 사용해 노드에 대한 조건과 관계에 대한 조건을 만들어 줄 수 있다. 

 

CALL gds.degree.stream('proj-cypher',{relationshipWeightProperty: 'actedWithCount'})
YIELD nodeId, score
RETURN gds.util.asNode(nodeId).name AS name, score
ORDER BY score DESC LIMIT 10

이후 위 쿼리를 사용해 가중치를 부여해 다시 스트리밍을 할 수 있다.

 

CALL gds.graph.project.cypher(
  // 프로젝션 이름
  'movie-ratings-after-2014',
  // 노드에 대한 사이퍼
  '
    MATCH (u:User) RETURN id(u) AS id, labels(u) AS labels
    UNION MATCH (m:Movie) WHERE m.year > 2014 RETURN id(m) AS id, labels(m) AS labels
  ',
  // 영화를 평가한 모든 유저를 찾는 사이퍼
  // 등급이 4보다 크거나 같은 관계 속성을 갖는 것만 필터링
  // 또한 영화는 2014년 이후에 개봉된 영화로만 필터링(year>2014)
  '
    MATCH (u:User)-[r:RATED]->(m:Movie)
    WHERE r.rating >= 4 AND m.year > 2014
    RETURN id(u) AS source,
        id(m) AS target,
        r.rating AS rating,
        "RATED" AS type
  '
);

위 쿼리는 2014년 이후 개봉된 영화를 평가한 모든 User 노드를 나타내는 사이퍼 프로젝션을 생성하는 쿼리이다. 등급이 4보다 크거나 같은 RATED 관계만 포함한다.

 

네이티브 프로젝션으로 전환

사이퍼 프로젝션은 좋지만 워크플로가 성숙하고 그래프 프로젝션이 더 커지고 빠른 성능을 필요로 하게 됨에 따라 기본 프로젝션인 네이티브 프로젝션으로 전환하는 것이 좋다.

//최근 릴리스 및 수익 조건에 따라 노드 레이블 설정
MATCH (m:Movie)
WHERE m.year >= 1990 AND m.revenue >= 1000000
SET m:RecentBigMovie;

//반대 방향으로 관계를 만드는 네이티브 프로젝션을 생성
CALL gds.graph.project('proj-native',
  ['Actor','RecentBigMovie'],
  {
  	ACTED_IN:{type:'ACTED_IN'},
    HAS_ACTOR:{type:'ACTED_IN', orientation: 'REVERSE'}
  }
);

//관계 집계를 위한 경로 유틸리티(가중치 속성 없음)
CALL gds.beta.collapsePath.mutate('proj-native',{
    pathTemplates: [['ACTED_IN', 'HAS_ACTOR']],
    allowSelfLoops: false,
    mutateRelationshipType: 'ACTED_WITH'
});

그 예시는 위 쿼리와 같다. 

 

뭐 하나 할 때마다 인증서 주는거 귀엽다.

반응형

댓글