그래프 형식은 존재할 수 있는 노드와 가장자리, 해당 레이블 및 속성 및 서로 연결하는 방법을 지정하여 그래프의 구조를 정의합니다. 그래프 형식을 스키마 또는 청사진으로 간주합니다. ER(엔터티 관계) 다이어그램에서 관계형 데이터베이스의 테이블 및 외래 키 관계를 설명하는 방식과 유사합니다.
이 문서에서는 노드 형식, 에지 형식, 제약 조건 및 상속을 포함하여 GQL 구문을 사용하여 그래프 형식을 정의하는 방법을 설명합니다.
중요합니다
이 글은 오직 소셜 네트워크 예시 그래프 데이터셋만을 사용합니다.
그래프 형식은 다음과 같은 몇 가지 주요 이점을 제공합니다.
- 데이터 유효성 검사: 그래프에 유효한 노드와 에지 조합만 포함되어 있는지 확인합니다.
- 공유 구조: 애플리케이션이 기대할 수 있는 노드 유형, 엣지 유형, 속성 및 제약 조건을 정의하세요.
- 설명서: 개발자 및 분석가를 위한 그래프 구조에 대한 명확한 사양으로 사용됩니다.
비고
이 문서에서는 개념적으로 그래프 형식을 소개하고 GQL 표준에 정의된 구문을 사용하여 해당 정의를 보여 줍니다. 그러나 이 구문은 현재 그래프에 대해 직접 지원되지 않습니다.
지원되는 Fabric 경험을 통해 그래프를 설계하고 생성하려면 '그래프 스키마 설계'를 참조하세요. 노드 타입, 엣지 타입, 상속, 속성 선언, 키 제약 조건 뒤에 있는 공식 GQL 모델이 필요할 때 이 글을 활용하세요.
구조적으로 그래프 형식은 그래프 형식의 허용되는 노드 형식 및 에지 형식을 정의하고 해당 그래프를 추가로 제한하는 추가 제약 조건을 정의합니다.
비고
노드 형식, 에지 형식 및 제약 조건 정의 집합을 사용하여 그래프 형식을 정의합니다. 이러한 정의의 순서를 변경해도 정의하려는 그래프 형식은 변경되지 않습니다.
노드 형식 정의
노드 형식은 노드에 포함할 수 있는 레이블 및 속성 형식을 지정합니다. 기본 노드 형식을 지정하는 방법은 다음과 같습니다.
(:Organization => {
id :: UINT64 NOT NULL,
name :: STRING,
url :: STRING
})
이 예제에서는 다음을 사용하여 노드를 정의하는 노드 형식을 만듭니다.
- 레이블
Organization입니다. -
id부호 없는 정수 값을 보유하며 null일 수 없는 속성입니다. -
name문자열 값을 보유하는 속성입니다(null일 수 있음). -
url문자열 값을 보유하는 속성입니다(null일 수 있음).
연산자를 :: 사용하여 각 속성에 대한 데이터 형식을 지정합니다. 속성에 항상 값이 있어야 함을 나타내는 데 사용합니다 NOT NULL .
비고
GQL NOT NULL 에서는 SQL과 다른 형식의 일부입니다.
노드 형식은 더 많은 속성과 데이터 형식을 사용하여 더 복잡할 수도 있습니다.
(:Person => {
id :: UINT64 NOT NULL,
creationDate :: ZONED DATETIME,
firstName :: STRING,
lastName :: STRING,
gender :: STRING,
birthday :: UINT64,
browserUsed :: STRING,
locationIP :: STRING
})
여러 레이블이 있는 노드 형식
노드에는 상속 및 분류를 지원하는 여러 레이블이 있을 수 있습니다. 노드 형식에 대해 여러 레이블을 지정할 수 있지만 하나의 레이블("키 레이블")은 노드 유형을 고유하게 식별 해야 합니다 (레이블을 하나만 지정하면 노드 형식의 키 레이블로 사용됩니다).
예를 들어 다음을 고려합니다.
(:University => :Organization),
(:Company => :Organization)
University
Company 여기서는 정의된 두 노드 형식의 키 레이블이며 두 Organization 형식에서 공유하는 보조 레이블입니다. 키 레이블과 보조 레이블이 각 노드 형식으로 => 구분되는 방식을 확인합니다. 이 방법은 대학과 회사 모두 조직의 유형인 형식 계층 구조를 만듭니다.
키 레이블은 노드 형식을 식별하므로 이 구문을 사용할 때 보조 레이블로 식별되는 노드 형식의 속성이 자동으로 상속됩니다. 따라서 이전 구문을 이해하여 다음 노드 형식을 효과적으로 정의할 수 있습니다.
(:University => :Organization {
id :: UINT64 NOT NULL,
name :: STRING,
url :: STRING
}),
(:Company => :Organization {
id :: UINT64 NOT NULL,
name :: STRING,
url :: STRING
})
비고
키 레이블은 노드 형식 계층 구조를 정의할 때 필수적입니다. 여러 형식이 동일한 레이블을 공유할 때 참조하는 노드 형식을 시스템에서 이해하는 데 도움이 됩니다.
상속 바로 가기를 사용하여 시간 절약
부모 노드 형식에서 레이블 및 속성을 반복하면 지루하고 오류가 발생하기 쉽습니다. 그래프는 연산자를 += 제공하므로 추가(편집되지 않은) 레이블 및 속성 형식만 지정할 수 있습니다.
(:Post => :Message += {
language :: STRING,
imageFile :: STRING
})
추가 속성이 지정되지 않은 경우 그래프는 부모 형식에서 필요한 모든 속성을 상속합니다.
(:Comment => :Message) -- Same as: (:Comment => :Message += {})
추상 노드 형식 사용
그래프에 해당 형식의 구체적인 노드가 없는 경우에도 계층 구조를 빌드하기 위한 노드 형식만 정의할 수 있습니다. 추상 노드 형식은 개념적 그룹화 및 공유 속성 집합을 만드는 데 유용합니다. 이를 위해 그래프에서와 같이 ABSTRACT 노드 형식을 정의할 수 있습니다.
ABSTRACT (:Message => {
id :: UINT64 NOT NULL,
creationDate :: ZONED DATETIME,
browserUsed :: STRING,
locationIP :: STRING,
content :: STRING,
length :: UINT64
})
추상 노드 형식은 직접 그래프 로드에 사용할 수 없습니다. 계층 구조를 구성하고 공유 속성을 정의하기 위해서만 존재합니다. 추상 형식에서 상속되는 구체적인 노드 형식은 데이터로 로드할 수 있습니다.
에지 형식 및 패밀리 정의
에지 형식은 에지에 대한 키 레이블, 속성 형식 및 엔드포인트 노드 형식을 정의합니다. 그래프 데이터베이스에서 에지는 노드 간의 연결을 나타냅니다. 에지 정의는 그래프에서 허용되는 관계를 시스템에 알려줍니다.
(:Person)-[:knows { creationDate :: ZONED DATETIME }]->(:Person)
이 에지 형식은 다음을 사용하여 모든 가장자리를 정의합니다.
- (키) 레이블
knows입니다. -
creationDate값을 보유ZONED DATETIME하는 속성입니다(타임스탬프와 표준 시간대 오프셋이 함께 표시됨). - 원점과 대상 엔드포인트 모두 모두 노드여야
Person합니다.
화살표 -> 는 원점에서 목표물까지의 가장자리 방향을 나타냅니다. 이 방향 정보는 그래프의 의미 체계를 이해하는 데 매우 중요합니다.
다음은 에지 형식의 더 많은 예입니다.
(:Person)-[:studyAt { classYear :: UINT64 }]->(:University)
(:Person)-[:workAt { workFrom :: UINT64 }]->(:Company)
엔드포인트 노드 형식에 대한 키 레이블(PersonUniversity또는Company)만 지정하면 됩니다. 전체 노드 형식 정의를 반복할 필요는 없습니다. 시스템은 전체 노드 형식 정의에 대한 이러한 참조를 확인합니다.
그래프 에지 형식 패밀리
그래프 에지 키 레이블은 노드 키 레이블과 다르게 작동합니다. 동일한 레이블 및 속성 형식이 있는 한 그래프 형식에 동일한 키 레이블을 가진 여러 에지 형식을 가질 수 있습니다. 그러나 키 레이블이 동일한 두 에지 형식은 하나 이상의 엔드포인트 노드 형식에서 달라야 합니다. 키 레이블이 동일한 에지 형식 집합은 에지 형식 패밀리입니다.
이 개념을 사용하면 서로 다른 유형의 엔터티 간에 동일한 유형의 관계를 모델링할 수 있습니다.
Example:
(:City)-[:isPartOf]->(:Country),
(:Country)-[:isPartOf]->(:Continent)
두 에지 형식 모두 레이블을 isPartOf 사용하지만 서로 다른 유형의 노드를 연결하여 계층적 포함 관계를 나타내는 에지 형식 패밀리를 형성합니다.
엣지 타입 정의에서 노드 서브타이핑을 활용하세요
가능한 각 에지 유형을 철자해야 하는 것은 지루할 수 있습니다. 간소화하려면 엔드포인트에 내포된 노드 형식의 계층 구조와 일치하는 에지 형식 패밀리를 정의합니다.
Example:
-- Node types
ABSTRACT (:Message { ... }),
(:Post => :Message { ... }),
(:Comment => :Message { ... }),
-- All edge types (x)-[:hasTag]->(:Tag) where x is at least a (:Message)
(<:Message)-[:hasTag]->(:Tag)
이 정의는 다음 에지 형식을 암시적으로 정의합니다.
(:Post)-[:hasTag]->(:Tag)
(:Comment)-[:hasTag]->(:Tag)
지원되는 속성 형식
GQL 표준은 지지 STRING, BOOL( INT 서명된 정수), 그리고 FLOAT 속성 가치 타입에 대한 최소 적합성을 주장하는 구현을 요구합니다. 그래프는 추가적인 속성 가치 유형을 지원합니다.
그래프가 현재 지원하는 속성 유형에 대해서는 '현재 제한 사항'의 데이터 유형을 참조하세요. GQL 값 의미론과 더 넓은 쿼리 유형 시스템에 대해서는 GQL 값 및 값 유형을 참조하세요.
중요합니다
지정된 그래프 형식의 노드 형식 또는 에지 형식에서 발생하는 이름이 같은 모든 속성 형식은 동일한 속성 값 형식을 지정해야 합니다.
유일한 예외: null 값을 포함하는지 여부에 따라 다를 수 있습니다.
예를 들어 이 규칙에 따라 그래프 형식은 유효하지만 그래프 형식 (:A { id :: STRING }), (:B { id :: STRING NOT NULL})(:A { id :: STRING }), (:B { id :: INT}) 은 유효하지 않습니다.
노드 키 제약 조건 설정
노드 키 제약 조건은 그래프의 각 노드가 하나 이상의 속성 값으로 고유하게 식별되는 방법을 정의합니다. 키 제약 조건은 관계형 데이터베이스의 기본 키 제약 조건처럼 작동하며 데이터 무결성을 보장합니다. 노드 키 제약 조건은 여러 노드 형식의 노드를 대상으로 할 수 있으므로 전체 개념 계층에 대한 노드 키를 정의할 수 있습니다.
주요 제약 조건을 이해하는 것은 다음과 같은 이유로 중요합니다.
- 고유성 확인: 비즈니스 논리에 따라 중복 노드를 방지합니다.
- 식별 정의: 어떤 속성 값이 노드를 식별하는지 확인하세요.
- 데이터 통합 지원: 다양한 데이터 원본에서 노드를 참조하는 안정적인 방법을 제공합니다.
중요합니다
그래프의 경우 정확히 하나의 키 제약 조건이 모든 노드를 제한해야 합니다.
노드 키 제약 조건의 작동 방식
그래프 형식에서 노드 키 제약 조건을 지정할 수 있습니다. 각 노드 키 제약 조건에는 효과적으로 작동할 수 있는 특정 특성이 있습니다.
노드 키 제약 조건의 구성 요소:
- 쉽게 참조할 수 있는 그래프 형식 내에 고유한 이름이 있습니다.
- 제약 조건이 적용되는 노드를 지정하는 간단한 제약 조건 패턴을 사용하여 대상 노드를 정의합니다.
- 고유 키 값을 형성하는 속성을 정의합니다.
Example:
CONSTRAINT person_pk
FOR (n:Person) REQUIRE n.id IS KEY
이 구문은 person_pk 이상이 있는 모든 노드에 대해 명명된 Person 노드 키 제약 조건을 만듭니다. 제약 조건은 그래프의 각 노드가 해당 id 속성으로 고유하게 식별되도록 합니다. 레이블이 있는 두 노드는 Person 동일한 id 값을 가질 수 없습니다.
구문을 사용하여 고유성을 보장하기 위해 여러 속성을 함께 사용하는 CONSTRAINT ... FOR ... REQUIRE (n.prop1, n.prop2) IS KEY 복합 키를 정의할 수도 있습니다.
중요합니다
키 제약 조건에 사용되는 속성:
- null일 수 없습니다.
- 키 제약 조건이 대상으로 하는 노드 형식 및 에지 형식에서와 같이
NOT NULL선언해야 합니다.