Typy grafů GQL

Typ grafu definuje strukturu grafu tak, že určí, které uzly a hrany mohou existovat, jejich popisky a vlastnosti a jak se vzájemně propojují. Typ grafu si můžete představit jako schéma nebo podrobný plán – podobně jako diagram ER (relace entit) popisuje tabulky a relace cizích klíčů v relační databázi.

Tento článek vysvětluje, jak definovat typy grafů pomocí syntaxe GQL, včetně typů uzlů, typů okrajů, omezení a dědičnosti.

Důležité

Tento článek výhradně používá datovou sadu grafů ze sociálních sítí.

Typy grafů poskytují několik klíčových výhod:

  • Ověření dat: Ujistěte se, že graf obsahuje jenom platné kombinace uzlů a okrajů.
  • Optimalizace dotazů: Pomozte dotazovacímu stroji porozumět vaší datové struktuře pro lepší výkon.
  • Dokumentace: Slouží jako jasná specifikace struktury grafu pro vývojáře a analytiky.

Poznámka:

Tento článek představuje typy grafů koncepčně a ilustruje jejich definici pomocí syntaxe definované ve standardu GQL. Tato syntaxe se ale v současné době nepodporuje přímo pro graf.

Typ grafu definuje povolené typy uzlů a hraniční typy grafů typu grafu a další omezení, která tyto grafy dále omezují.

Poznámka:

Definujte typy grafů pomocí sady typů uzlů, hraničního typu a definic omezení. Změna pořadí těchto definic nezmění typ grafu, který definujete.

Definování typů uzlů

Typ uzlu určuje, jaké popisky a typy vlastností můžou uzly mít. Tady je postup, jak zadat základní typ uzlu:

(:Organization => { 
  id :: UINT64 NOT NULL, 
  name :: STRING, 
  url :: STRING 
})

Tento příklad vytvoří typ uzlu, který definuje uzly pomocí:

  • Popisek Organization.
  • Vlastnost id , která obsahuje celočíselné hodnoty bez znaménka a nemůže mít hodnotu null.
  • name Vlastnost, která obsahuje řetězcové hodnoty (může mít hodnotu null).
  • url Vlastnost, která obsahuje řetězcové hodnoty (může mít hodnotu null).

Pomocí operátoru :: zadejte datový typ pro každou vlastnost. Slouží NOT NULL k označení, že vlastnost musí mít vždy hodnotu.

Poznámka:

V jazyce GQL NOT NULL je součástí typu, který se liší od SQL.

Typy uzlů můžou být také složitější s více vlastnostmi a datovými typy:

(:Person => {
    id :: UINT64 NOT NULL,
    creationDate :: ZONED DATETIME,
    firstName :: STRING,
    lastName :: STRING,
    gender :: STRING,
    birthday :: UINT64,
    browserUsed :: STRING,
    locationIP :: STRING
})

Typy uzlů s více popisky

Uzly můžou mít více popisků pro podporu dědičnosti a kategorizace. Pro typ uzlu můžete zadat více popisků, ale jeden popisek (popisek klíče) musí jednoznačně identifikovat typ uzlu (Pokud je zadán pouze jeden popisek, bude to popisek klíče typu uzlu).

Jako příklad zvažte:

(:University => :Organization),

(:Company => :Organization)

University Tady jsou Company popisky klíčů dvou definovaných typů uzlů, zatímco Organization sekundární popisek sdílený oběma typy. Všimněte si, jak se popisek klíče a sekundární popisky oddělují => v jednotlivých typech uzlů. Tento přístup vytvoří hierarchii typů, kde univerzity i společnosti jsou typy organizací.

Vzhledem k tomu, že popisky klíčů identifikují typy uzlů, vlastnosti typů uzlů identifikované sekundárními popisky se při použití této syntaxe automaticky dědí. Předchozí syntaxi proto lze efektivně definovat následující typy uzlů:

(:University => :Organization {
  id :: UINT64 NOT NULL, 
  name :: STRING, 
  url :: STRING 
}),

(:Company => :Organization {
  id :: UINT64 NOT NULL, 
  name :: STRING, 
  url :: STRING 
})

Poznámka:

Při definování hierarchií typů uzlů jsou klíčové popisky. Pomáhají systému pochopit, na jaký typ uzlu odkazujete, když stejný popisek sdílí více typů.

Úspora času pomocí zkratek dědičnosti

Opakující se popisky a vlastnosti z nadřazených typů uzlů jsou zdlouhavé a náchylné k chybám. Graph poskytuje operátor, += takže můžete zadat pouze nadbytečné popisky a typy vlastností (bezherited):

(:Post => :Message += {
    language :: STRING,
    imageFile :: STRING
})

Pokud nejsou zadány žádné další vlastnosti, graf dědí všechny požadované vlastnosti z nadřazeného typu:

(:Comment => :Message)  -- Same as: (:Comment => :Message += {})

Použití abstraktních typů uzlů

Typy uzlů můžete definovat čistě pro vytváření hierarchií, i když graf neobsahuje konkrétní uzly tohoto typu. Abstraktní typy uzlů jsou užitečné pro vytváření koncepčních seskupení a sad sdílených vlastností. Pro tento účel můžete definovat typ uzlu jako ABSTRACT v grafu:

ABSTRACT (:Message => {
    id :: UINT64 NOT NULL,
    creationDate :: ZONED DATETIME,
    browserUsed :: STRING,
    locationIP :: STRING,
    content :: STRING,
    length :: UINT64
})

Abstraktní typy uzlů nejsou k dispozici pro přímé načítání grafu. Existují pouze pro strukturování hierarchie a definování sdílených vlastností. Konkrétní typy uzlů, které dědí z abstraktních typů, lze načíst s daty.

Definování typů a rodin okrajů

Typ hrany definuje popisek klíče, typy vlastností a typy uzlů koncového bodu pro hrany. V grafových databázích představují hrany propojení mezi uzly. Definice hraničních zařízení říká systému, jaké relace jsou v grafu povolené:

(:Person)-[:knows { creationDate :: ZONED DATETIME }]->(:Person)

Tento typ hrany definuje všechny hrany pomocí:

  • Popisek knows(klíč) .
  • Vlastnost creationDate , která obsahuje ZONED DATETIME hodnoty (časové razítko společně s posunem časového pásma).
  • Výchozí i cílové koncové body, které musí být Person oba uzly.

Šipka -> ukazuje směr hrany, od počátku k cíli. Tyto směrové informace jsou zásadní pro pochopení sémantiky grafu.

Tady jsou další příklady hraničních typů:

(:Person)-[:studyAt { classYear :: UINT64 }]->(:University)
(:Person)-[:workAt { workFrom :: UINT64 }]->(:Company)

Pro typy uzlů koncového bodu stačí zadat popisky klíčů (PersonUniversityneboCompany) – nemusíte opakovat úplnou definici typu uzlu. Systém tyto odkazy přeloží na definice celého typu uzlu.

Rodiny typů okrajů grafu

Popisky klíčů edge grafu fungují jinak než popisky klíčů uzlů. V typu grafu můžete mít více typů okrajů se stejným popiskem klíče, pokud mají stejné popisky a typy vlastností. Dva hraniční typy se stejným popiskem klíče se ale musí lišit alespoň v jednom typu uzlu koncového bodu. Sada typů okrajů se stejným popiskem klíče je řada typů okrajů.

Tento koncept umožňuje modelovat stejný typ vztahu mezi různými typy entit.

Example:

(:City)-[:isPartOf]->(:Country),
(:Country)-[:isPartOf]->(:Continent)

Oba typy okrajů používají isPartOf popisek, ale propojují různé typy uzlů, které tvoří řadu typů okrajů, která představuje hierarchické vztahy zahrnutí.

Použijte podtypování uzlů v definicích typů hran

Každý možný typ hrany může být zdlouhavý. Pro zjednodušení definujte rodiny typů hraničních zařízení, které odpovídají hierarchii typů uzlů odvozených z jejich koncových bodů.

Příklad:

-- Node types
ABSTRACT (:Message { ... }),
(:Post => :Message { ... }),
(:Comment => :Message { ... }),

-- All edge types (x)-[:hasTag]->(:Tag) where x is at least a (:Message)
(<:Message)-[:hasTag]->(:Tag) 

Tato definice implicitně definuje následující typy okrajů:

(:Post)-[:hasTag]->(:Tag) 
(:Comment)-[:hasTag]->(:Tag) 

Podporované typy vlastností

Při definování typu vlastnosti použijte typ hodnoty vlastnosti, který graf podporuje. Volba správných datových typů je důležitá pro efektivitu úložiště a výkon dotazů.

Pro hodnoty vlastností použijte následující datové typy:

  • INT (také: INT64)
  • UINT (také: UINT64)
  • STRING
  • BOOL (také: BOOLEAN)
  • DOUBLE (také: FLOAT64, FLOAT)
  • T NOT NULL, kde T je některý z předchozích datových typů.
  • LIST<T> a LIST<T> NOT NULL, kde T je některý z předchozích datových typů.

Úplné informace o typech hodnot najdete v tématu Hodnoty GQL a typy hodnot.

Důležité

Všechny typy vlastností se stejným názvem, které se vyskytují v typu uzlu nebo hraničním typu daného typu grafu, musí zadat stejný typ hodnoty vlastnosti. Jedinou výjimkou: Mohou se lišit v tom, zda obsahují hodnotu null. Například podle tohoto pravidla je typ (:A { id :: STRING }), (:B { id :: STRING NOT NULL}) grafu platný, zatímco typ grafu s neplatným (:A { id :: STRING }), (:B { id :: INT}) typem.

Nastavení omezení klíče uzlu

Omezení klíče uzlu definují, jak se jednotlivé uzly v grafu jedinečně identifikují jednou nebo více hodnotami jeho vlastností. Klíčová omezení fungují jako omezení primárního klíče v relačních databázích a zajišťují integritu dat. Omezení klíče uzlu může cílit na uzly napříč několika typy uzlů, což umožňuje definovat klíče uzlů pro celé koncepční hierarchie.

Pochopení klíčových omezení je zásadní, protože:

  • Zajištění jedinečnosti: Zabránění duplicitním uzlům na základě obchodní logiky
  • Povolte efektivní vyhledávání: Umožňuje systému optimalizovat dotazy, které hledají konkrétní uzly.
  • Integrace dat podpory: Poskytuje stabilní způsob, jak odkazovat na uzly napříč různými zdroji dat.

Důležité

Pro graf musí přesně jedno omezení klíče omezit každý uzel.

Jak fungují omezení klíče uzlu

V typu grafu můžete zadat omezení klíče uzlu. Každé omezení klíče uzlu má specifické charakteristiky, díky kterým funguje efektivně:

Komponenty omezení klíče uzlu:

  • Obsahuje jedinečný název v rámci typu grafu, který umožňuje snadnou referenci.
  • Definuje cílové uzly pomocí jednoduchého vzoru omezení , který určuje, na které uzly se omezení vztahuje.
  • Definuje vlastnosti, které tvoří jedinečnou hodnotu klíče.

Example:

CONSTRAINT person_pk
  FOR (n:Person) REQUIRE n.id IS KEY

Tato syntaxe vytvoří omezení klíče uzlu pojmenované person_pk pro všechny uzly s alespoňPerson popiskem. Omezení zajišťuje, aby každý uzel v grafu byl jedinečně identifikován jeho id vlastností. Žádné dva uzly s Person popiskem mohou mít stejnou id hodnotu.

Pomocí syntaxe můžete také definovat složené klíče, které používají více vlastností, abyste zajistili jedinečnost CONSTRAINT ... FOR ... REQUIRE (n.prop1, n.prop2) IS KEY .

Důležité

Vlastnosti použité v klíčových omezeních:

  • Nemůže mít hodnotu null.
  • Musí být deklarovány jako NOT NULL v typech uzlů a hraničních typech cílených omezením klíče.