반응형
- Cypher & GQL
Neo4j 2.0을 사용하면 그래프 내에서 Node 세트를 정의할 수 있습니다.
업데이트: 이제 2.0.0-M02를 사용할 수 있습니다.
| 필립 래슬 제품 담당 수석 이사 |
업데이트: 이제 2.0.0-M02를 사용할 수 있습니다.
오늘 저희는 Neo4j 2.0.0-M01 마일스톤 릴리스를 출시합니다! Neo4j 2.0 시리즈는 앞으로 몇 달 안에 정식 버전(GA)으로 출시될 예정이에요. 이번 릴리스는 13년 전 Neo4j 출시 이후 처음으로 Property Graph 모델을 변경한다는 점에서 정말 의미가 깊어요. 구체적으로는 새로운 구성 요소인 Labels를 추가할 예정이랍니다.
이번 작업은 데이터 모델에 중요한 부분을 추가하는 첫 번째 단계이고, 여러분의 소중한 의견을 듣기 위해 코드를 먼저 공개하는 거예요. 이 마일스톤 릴리스는 일종의 라고 생각해주시면 좋을 것 같아요. 여러분이 이 새로운 기능을 어떻게 활용하고 싶으신지 정말 궁금하고, 여러분의 생각을 듣고 싶어요!
예를 들어, Joe라는 사람을 위한 Node를 만든다고 가정해 볼게요. Joe는 단순한 Node가 아니죠. 그는 '사람'이에요. 따라서 Joe의 Node를 "Person"으로 지정하고 싶을 텐데요. 이전에 Neo4j를 사용해본 적이 있다면, 아마 `type`이라는 Property를 추가하고 값을 "Person"으로 설정해서 이 작업을 처리했을 거예요.
이 방법도 유용하긴 해요. 왜냐하면 이제 "가정용품" Node나 "지리적 위치" Node처럼 완전히 다른 그래프의 항목들과 Joe를 구별할 수 있으니까요. 맞아요, 이런 것들은 서로 다르게 다뤄져야 하죠.
이제 Joe에게 좌파, 우파, 아니면 온건 중도파 같은 정치적 성향을 부여하고 싶다고 가정해 볼게요. Property를 사용해서도 이 작업을 할 수 있지만, 특정 정당에 소속된 모든 사람을 쉽게 찾고 싶을 수도 있겠죠. Joe가 "중도파"라는 것을 알게 되면, 아래와 같이 정당을 Node로 분리한 다음 Joe를 그의 정당과 연결하기로 결정할 수도 있을 거예요.
이제 자연스럽게 그래프에서 하고 싶은 작업 중 하나는 "Person"의 고유 식별자를 기반으로 "Person" `Node`(다른 `Node`는 제외)를 자동으로 인덱싱하는 것이겠죠? (너무 단순화해서 이걸 "이름"이라고 해볼게요.) Cypher를 사용한다면 이게 꽤나 어려운 일이에요. 사실 Neo4j는 "사람"이 지리적 위치와 다르다는 것을 알지 못하기 때문에 아예 불가능할 수도 있어요. "이름"을 인덱싱하려고 하면 그래프의 모든 항목에 대해 인덱스를 생성하게 되어서 문제가 생길 수 있죠. 지리적 위치 이름은 사람 이름과 같지 않고, 도시가 사람과 같을 리도 없잖아요. "Middle-Wing" `Node`의 경우, 해당 `Node`가 그룹에 속하도록 지정하는 것이 유일한 목적인 많은 연결 때문에 그래프가 엄청 복잡해질 수 있어요.
그래서 우리는 이걸 더 잘할 수 있는 방법을 찾아봤어요. 이상적인 솔루션은 그래프를 더 쉽게 이해할 수 있도록 도와줄 뿐만 아니라, Cypher가 `Node`에 따라 `Node`에 위치할 수 있게 해줘서 (인덱싱도 가능하게 해서) Cypher를 훨씬 더 강력하게 만들어 줄 거예요.
그래서 2.0에는 `Node`를 그룹화하거나 분류하는 방법이 도입되었어요. 일단은 이 구조를 "Label"이라고 부르기로 했어요. "Label"이라는 용어는 일반적인 용도와 `Node`가 여러 개의 Label을 가질 수 있다는 점을 고려한 거예요. Label의 다양한 용도 중 하나는 (아마도 처음에는 가장 직관적인 용도일 텐데) 애플리케이션의 타입 시스템과 연결할 수 있는 그래프에 "hook"을 제공하는 것이에요. 이 기능 자체가 명시적으로 계층적이지 않기 때문에 (말 그대로 태그일 뿐이고, `Node`당 0개부터 여러 개까지 가질 수 있어요) Label이라고 부르는 거랍니다.
그래프는 데이터에 관계가 있기 때문에 그래프인 거죠. `Property Graph`에서 관계는 항상 두 `Node`가 어떻게 관련되어 있는지 설명하는 유형을 가지고 있어요. Label은 그 아이디어를 확장해서 전체 `Node` 집합이 어떻게 관련되어 있는지 설명하는 거예요. 이건 `Node`를 그룹화하는 메커니즘인 거죠. 어떻게 작동하냐고요? 아주 간단해요. 위의 예에서 "Type" 속성을 추가하고 Joe를 Party `Node`에 연결하는 대신, 두 개의 Label을 추가하는 거예요. 하나는 "Person"에 대한 Label이고, 다른 하나는 "Middle-Wing"에 대한 Label이죠.
이건 정말 다양한 가능성을 열어주고, 여러분 머릿속에 많은 아이디어를 떠오르게 할 거예요. Label을 어떻게 사용하는지에 대한 생각을 제한하기보다는, 다양한 색상 세트를 사용하는 예를 한번 살펴볼까요?
느슨하게 연결된 임의의 영역이 있고, 그 안에서 최소한 빨간색, 녹색 또는 파란색이 될 수 있다는 것을 알고 있다고 가정해 볼게요. 각 Node에 "색상" 속성을 추가하거나, 이를 각 색상의 Value Node에 연결할 수도 있겠죠. 하지만 우리는 항상 이 그룹 내에서 작업하고 싶기 때문에, Label을 사용해서 세트의 멤버를 식별할 거예요.
먼저 빨간색을 만들어 볼게요.
Label이 있는 Node 생성
CREATE(thing:Red {uid: “TK-421”, make: 191860 })
RETURN thing;
방금 만든 것을 찾으려면, Red Node 내에서만 검색한 다음 Label을 반환하면 돼요.
Node에서 Label 찾기
MATCH(thing:Red)
WHERE thing.uid = “TK-421”
RETURN labels(thing);
왜 `labels`가 복수일까요? 그건 `Node`에는 여러 개의 `Label`이 있을 수 있기 때문이에요. "TK-421"도 파란색 세트에 속한다고 가정해 볼게요. 다음과 같이 파란색 `Label`을 추가하면 돼요.
`Node`에 `Label` 추가하기
MATCH(thing:Red)
WHERE thing.uid = “TK-421”
SET thing:Blue;
일부 덴마크인은 `Label`에 대해 긴장할 수도 있지만, 이걸 사용하면 많은 이점이 있어요. `Node` 집합에 `Label`을 적용하면 의도가 분명해지죠. 즉, "이러한 `Node`는 자주 액세스되며 하나의 그룹으로 간주됩니다." 라는 걸 나타내는 거예요. `Database` 자체는 이제 이 정보로 작업을 수행할 수 있으므로 의도를 명시함으로써 이점을 얻을 수 있는 거죠.
우선, Neo4j는 세트 내에서 `Node`를 찾을 때 성능을 향상시키는 `Index`를 생성할 수 있어요.(`Index` 생성을 위한 새로운 Cypher 구문에 유의하세요!):
빨간색 및 파란색 노드를 찾는 속도를 높이기 위해 Index 생성
CREATE INDEX ON :Red(uid);
CREATE INDEX ON :Blue(uid);
두 번째 Label이 지정된 Node 및 Relationship 만들기
CREATE(other_thing:Blue {uid: “TURK-182”, make: 181663})
WITH other_thing
MATCH(thing:Red)
WHERE thing.uid = “TK-421”
CREATE (thing)-[:HONORS]->(other_thing)
RETURN thing, other_thing;
훨씬 더 많은 즐거움이 있어요. 자세한 내용은 언제나 그렇듯이Neo4j 매뉴얼에서 확인해 보세요. 다시 말하지만, 이 간단한 변화가 엄청난 영향을 미칠 수 있다는 점! 가능성을 탐색하고 언어와 API를 조정하는 동안 Label을 사용해 보시길 추천드려요. Google 그룹에 피드백을 제공해서 여러분이 어떻게 사용하고 있는지 알려주세요. (다른 사람들이 여러분의 피드백을 보고 자신의 의견과 관찰로 응답할 수 있을 거예요.)
혹시라도...
Cypher에 새로운 기능이 추가되었어요. 바로 CASE 표현식인데요, 입력 값을 결과 값으로 매핑해주는 친구죠. 다른 일반적인 프로그래밍 언어에서도 비슷한 구조를 찾아볼 수 있을 거예요.
-
간단하게 말하면, CASE는 속성을 직접 비교해서 첫 번째로 일치하는 WHEN 절의 결과 값을 선택하는 방식이에요.
MATCH (r:빨간색) RETURN CASE r.uid
WHEN "TK-421" THEN "당신은 왜 자리에 없나요?"
WHEN "TURK-182" THEN "한 사람의 작품"
ELSE "…"
END
-
좀 더 일반적인 형태에서는, 각각의 WHEN 절에서 임의의 조건자를 사용해서 결과를 선택할 수 있어요.
MATCH(r:빨간색) RETURN CASE
r.color > 180000이면 “붉은색”
r.color < 180000이면 "자주색"
ELSE "단순한 빨간색"
END
이 미리보기 마일스톤, 재밌게 즐기셨나요? 사용 Neo4j 구글 그룹에서 Neo4j 팀과 Neo4j 커뮤니티의 다른 구성원들에게 여러분의 생각을 알려주세요.이번 릴리스에는 셸을 포함해서 몇 가지 개선 사항이 더 있는데, 이건 앞으로 블로그에서 다룰 예정이에요. 그리고 물론, 다가오는 Neo4j 2.0 마일스톤에서는 더 많은 것들을 보게 될 거예요. 그 동안, 미리보기를 업그레이드했어요. 온라인 콘솔에서 새로운 기능을 테스트해 볼 수 있도록, 이제 레이블로 향상된 매트릭스 그래프가 제공된답니다.
마지막으로, 곧 프로덕션 환경에 적용할 계획이라면 1.9 버전을 적극적으로 개발하는 걸 추천드려요. 1.9 버전은 앞으로 몇 주 안에 GA될 예정이거든요 (이번 주에 RC를 찾아보세요!).
최신 2.0 마일스톤에는 단일 트랜잭션 내에서 여러 Cypher 문을 관리하기 위한 새로운 HTTP endpoint가 도입되었어요. 첫 번째 명세서 배치로 트랜잭션을 생성하면 되는데요. 추가 요청을 제출할 수 있고 트랜잭션을 커밋하거나 롤백할 수 있는 URL을 받게 될 거예요. 자세한 내용은 Neo4j 매뉴얼을 참조하세요.
Neo4j 팀 드림!
Graph Database에 대해 더 자세히 알고 싶으신가요? 아래를 클릭해서 O'Reilly의 무료 전자책을 다운로드하고, 지금 바로 여러분의 애플리케이션에 그래프 기술을 사용하는 방법을 알아보세요.
- Cypher
에이치시스템즈의 LogTree는 Neo4j 기반 GraphRAG 플랫폼으로, 데이터를 자동으로 지식그래프화하고 자연어 질의로 즉시 답을 제공합니다.
반응형
'GraphRAG' 카테고리의 다른 글
| Precise Economic Policy in a World of Chaos (0) | 2026.05.28 |
|---|---|
| 관찰 가능한 그래프: Neo4j로 GraphRAG 성능 극대화하기 (0) | 2026.05.27 |
| LangChain과 LangGraph로 Neo4j GraphRAG 워크플로우 구축하기 (0) | 2026.05.27 |
| Neo4j GraphRAG 검색기를 MCP 서버로 구현하기 (0) | 2026.05.26 |
| AWS와 Neo4j, LLM 환각 해결 및 GenAI 진화를 위해 손을 잡다 (0) | 2026.05.26 |
