Freigeben über


GQL-Diagrammtypen

Hinweis

Dieses Feature ist zurzeit als öffentliche Preview verfügbar. Diese Vorschauversion wird ohne Vereinbarung zum Servicelevel bereitgestellt und ist nicht für Produktionsworkloads vorgesehen. Manche Features werden möglicherweise nicht unterstützt oder sind nur eingeschränkt verwendbar. Weitere Informationen finden Sie unter Supplementale Nutzungsbedingungen für Microsoft Azure Previews.

Ein Diagrammtyp definiert die Struktur eines Diagramms, indem angegeben wird, welche Knoten und Kanten vorhanden sein können, deren Beschriftungen und Eigenschaften und wie sie sich miteinander verbinden. Stellen Sie sich einen Diagrammtyp als Schema oder Blueprint vor – ähnlich wie ein ER-Diagramm (Entitätsbeziehung) Tabellen und Fremdschlüsselbeziehungen in einer relationalen Datenbank beschreibt.

In diesem Artikel wird erläutert, wie Diagrammtypen mithilfe der GQL-Syntax definiert werden, einschließlich Knotentypen, Edgetypen, Einschränkungen und Vererbung.

Von Bedeutung

In diesem Artikel wird ausschließlich das Beispieldiagramm-Dataset für soziale Netzwerke verwendet.

Graph-Typen bieten mehrere wichtige Vorteile:

  • Datenüberprüfung: Stellen Sie sicher, dass Ihr Diagramm nur gültige Knoten- und Randkombinationen enthält.
  • Abfrageoptimierung: Helfen Sie dem Abfragemodul, Ihre Datenstruktur zu verstehen, um eine bessere Leistung zu erzielen.
  • Dokumentation: Dient als klare Spezifikation der Diagrammstruktur für Entwickler und Analysten.

Hinweis

In diesem Artikel werden Diagrammtypen konzeptuell vorgestellt und ihre Definition mithilfe der im GQL-Standard definierten Syntax veranschaulicht. Diese Syntax wird jedoch derzeit nicht direkt für Graph unterstützt.

Strukturell definiert ein Diagrammtyp zulässige Knotentypen und Randtypen von Diagrammen des Diagrammtyps sowie zusätzliche Einschränkungen, die diese Diagramme weiter einschränken.

Hinweis

Definieren Sie Diagrammtypen mithilfe eines Satzes von Knotentyp, Edgetyp und Einschränkungsdefinitionen. Das Ändern der Reihenfolge dieser Definitionen ändert nicht den Diagrammtyp, den Sie definieren.

Definieren von Knotentypen

Ein Knotentyp gibt an, welche Bezeichnungen und Eigenschaftentypen Ihre Knoten aufweisen können. Hier erfahren Sie, wie Sie einen einfachen Knotentyp angeben:

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

In diesem Beispiel wird ein Knotentyp erstellt, der Knoten definiert mit:

  • Die Bezeichnung Organization.
  • Eine id Eigenschaft, die nicht signierte ganzzahlige Werte enthält und nicht null sein kann.
  • Eine name Eigenschaft, die Zeichenfolgenwerte enthält (kann null sein).
  • Eine url Eigenschaft, die Zeichenfolgenwerte enthält (kann null sein).

Verwenden Sie den :: Operator, um den Datentyp für jede Eigenschaft anzugeben. Wird NOT NULL verwendet, um anzugeben, dass die Eigenschaft immer einen Wert aufweisen muss.

Hinweis

In GQL NOT NULL ist Teil des Typs, der sich von SQL unterscheidet.

Knotentypen können auch komplexer sein, mit weiteren Eigenschaften und Datentypen:

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

Knotentypen mit mehreren Bezeichnungen

Knoten können mehrere Bezeichnungen aufweisen, um Vererbung und Kategorisierung zu unterstützen. Sie können mehrere Bezeichnungen für einen Knotentyp angeben, aber eine Bezeichnung (die "Schlüsselbeschriftung") muss den Knotentyp eindeutig identifizieren (Wenn nur eine Bezeichnung angegeben ist, wird dies als Schlüsselbeschriftung des Knotentyps bezeichnet).

Betrachten Sie beispielsweise Folgendes:

(:University => :Organization),

(:Company => :Organization)

University Hier sind Company die Schlüsselbeschriftungen der beiden definierten Knotentypen, während Organization es sich um eine sekundäre Bezeichnung handelt, die von beiden Typen gemeinsam verwendet wird. Beachten Sie, wie die Schlüsselbeschriftung und sekundäre Bezeichnungen in => jedem Knotentyp voneinander getrennt werden. Dieser Ansatz erstellt eine Typhierarchie, in der sowohl Universitäten als auch Unternehmen Arten von Organisationen sind.

Da Schlüsselbeschriftungen Knotentypen identifizieren, werden die eigenschaften von sekundären Bezeichnungen identifizierten Knotentypen bei Verwendung dieser Syntax automatisch geerbt. Daher kann die vorherige Syntax verstanden werden, um die folgenden Knotentypen effektiv zu definieren:

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

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

Hinweis

Schlüsselbeschriftungen sind wichtig, wenn Sie Knotentyphierarchien definieren. Sie helfen dem System zu verstehen, auf welchen Knotentyp Sie verweisen, wenn mehrere Typen dieselben Bezeichnungen gemeinsam verwenden.

Zeit sparen mit Vererbungsverknüpfungen

Wiederholte Bezeichnungen und Eigenschaften von übergeordneten Knotentypen werden mühsam und fehleranfällig. Graph stellt den += Operator bereit, sodass Sie nur die zusätzlichen (nicht inheritierten) Bezeichnungen und Eigenschaftentypen angeben können:

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

Wenn keine zusätzlichen Eigenschaften angegeben werden, erbt das Diagramm alle erforderlichen Eigenschaften vom übergeordneten Typ:

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

Verwenden abstrakter Knotentypen

Sie können Knotentypen nur für die Erstellung von Hierarchien definieren, auch wenn Ihr Diagramm keine konkreten Knoten dieses Typs enthält. Abstrakte Knotentypen sind nützlich zum Erstellen konzeptioneller Gruppierungen und freigegebener Eigenschaftensätze. Zu diesem Zweck können Sie einen Knotentyp wie ABSTRACT in Graph definieren:

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

Abstrakte Knotentypen sind für das Laden von direkten Diagrammen nicht verfügbar. Sie sind nur vorhanden, um Ihre Hierarchie zu strukturieren und freigegebene Eigenschaften zu definieren. Konkrete Knotentypen, die von abstrakten Typen erben, können mit Daten geladen werden.

Definieren von Edgetypen und Familien

Ein Edgetyp definiert die Schlüsselbeschriftung, Eigenschaftentypen und Endpunktknotentypen für Kanten. In Graphdatenbanken stellen Ränder Verbindungen zwischen Knoten dar. Die Edgedefinition teilt dem System mit, welche Beziehungen in Ihrem Diagramm zulässig sind:

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

Dieser Edgetyp definiert alle Kanten mit:

  • Die (Schlüssel) Beschriftung knows.
  • Eine creationDate Eigenschaft, die Werte enthält ZONED DATETIME (Zeitstempel zusammen mit einem Zeitzonenoffset).
  • Quell- und Zielendpunkte, die beide Knoten sein Person müssen.

Der Pfeil -> gibt die Richtung des Rands von Quelle zu Ziel an. Diese direktionalen Informationen sind entscheidend für das Verständnis der Semantik Ihres Graph.

Hier sind weitere Beispiele für Edgetypen:

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

Sie müssen nur die Schlüsselbeschriftungen (Person, Universityoder Company) für Endpunktknotentypen angeben . Sie müssen die vollständige Knotentypdefinition nicht wiederholen. Das System löst diese Verweise auf die vollständigen Knotentypdefinitionen auf.

Graph-Edgetypfamilien

Graph Edge-Tastenbeschriftungen funktionieren anders als Knotenschlüsselbeschriftungen. Sie können mehrere Edgetypen mit derselben Schlüsselbeschriftung in einem Diagrammtyp haben, solange sie dieselben Bezeichnungen und Eigenschaftentypen haben. Zwei Edgetypen mit derselben Schlüsselbezeichnung müssen sich jedoch in mindestens einem Endpunktknotentyp unterscheiden. Ein Satz von Edgetypen mit derselben Schlüsselbezeichnung ist eine Edgetypfamilie.

Mit diesem Konzept können Sie den gleichen Beziehungstyp zwischen verschiedenen Entitätstypen modellieren.

Example:

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

Beide Edgetypen verwenden die isPartOf Bezeichnung, verbinden jedoch unterschiedliche Knotentypen und bilden eine Edgetypfamilie, die hierarchische Eindämmungsbeziehungen darstellt.

Verwenden Sie Knoten-Subtyping in Kantentypisierungen

Es kann mühsam sein, jeden möglichen Randtyp zu erstellen. Um dies zu vereinfachen, definieren Sie Edgetypfamilien, die an der Hierarchie von Knotentypen ausgerichtet sind, die von ihren Endpunkten impliziert werden.

Beispiel:

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

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

Diese Definition definiert implizit die folgenden Edgetypen:

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

Unterstützte Eigenschaftentypen

Wenn Sie einen Eigenschaftstyp definieren, verwenden Sie einen Eigenschaftswerttyp, den Graph unterstützt. Die Auswahl der richtigen Datentypen ist wichtig für die Speichereffizienz und abfrageleistung.

Verwenden Sie die folgenden Datentypen für Eigenschaftswerte:

  • INT (auch: INT64)
  • UINT (auch: UINT64)
  • STRING
  • BOOL (auch: BOOLEAN)
  • DOUBLE (auch: FLOAT64, FLOAT)
  • T NOT NULL, wobei T es sich um einen der vorherigen Datentypen handelt.
  • LIST<T> und LIST<T> NOT NULL, wobei T es sich um einen der vorherigen Datentypen handelt.

Vollständige Informationen zu Werttypen finden Sie unter GQL-Werte und -Werttypen.

Von Bedeutung

Alle Eigenschaftstypen mit demselben Namen, die in einem Knotentyp oder Randtyp eines bestimmten Diagrammtyps auftreten, müssen denselben Eigenschaftswerttyp angeben. Die einzige Ausnahme: Sie können unterscheiden, ob sie den Nullwert enthalten. Ein Diagrammtyp mit (:A { id :: STRING }), (:B { id :: STRING NOT NULL}) dieser Regel ist z. B. gültig, während ein Diagrammtyp (:A { id :: STRING }), (:B { id :: INT}) ungültig ist.

Einrichten von Knotenschlüsseleinschränkungen

Knotenschlüsseleinschränkungen definieren, wie jeder Knoten in Ihrem Diagramm durch einen oder mehrere eigenschaftswerte eindeutig identifiziert wird. Schlüsseleinschränkungen funktionieren wie Primärschlüsseleinschränkungen in relationalen Datenbanken und stellen die Datenintegrität sicher. Eine Schlüsseleinschränkung von Knoten kann Knoten über mehrere Knotentypen hinweg als Ziel festlegen. Dadurch können Sie Knotenschlüssel für ganze konzeptionelle Hierarchien definieren.

Das Verständnis wichtiger Einschränkungen ist von entscheidender Bedeutung, da sie:

  • Eindeutigkeit sicherstellen: Verhindern doppelter Knoten basierend auf Ihrer Geschäftslogik.
  • Effiziente Nachschlagevorgänge ermöglichen: Ermöglichen Sie dem System, Abfragen zu optimieren, die nach bestimmten Knoten suchen.
  • Unterstützung der Datenintegration: Bieten Sie eine stabile Möglichkeit zum Verweisen auf Knoten in verschiedenen Datenquellen.

Von Bedeutung

Für Graph muss genau eine Schlüsseleinschränkung jeden Knoten einschränken.

Funktionsweise von Knotenschlüsseleinschränkungen

Sie können Knotenschlüsseleinschränkungen in Ihrem Diagrammtyp angeben. Jede Knotenschlüsseleinschränkung weist bestimmte Merkmale auf, die sie effektiv funktionieren lassen:

Komponenten einer Knotenschlüsseleinschränkung:

  • Verfügt über einen eindeutigen Namen innerhalb des Diagrammtyps, um leicht zu referenziert werden.
  • Definiert gezielte Knoten mithilfe eines einfachen Einschränkungsmusters , das angibt, auf welche Knoten die Einschränkung angewendet wird.
  • Definiert die Eigenschaften, die den eindeutigen Schlüsselwert bilden.

Example:

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

Diese Syntax erstellt eine Knotenschlüsseleinschränkung, die für alle Knoten mit mindestens der Person Bezeichnung benannt person_pk ist. Die Einschränkung stellt sicher, dass jeder Knoten im Diagramm durch seine id Eigenschaft eindeutig identifiziert wird. Keine zwei Knoten mit der Person Beschriftung können denselben id Wert aufweisen.

Sie können auch zusammengesetzte Schlüssel definieren, die mehrere Eigenschaften zusammen verwenden, um die Eindeutigkeit mithilfe der CONSTRAINT ... FOR ... REQUIRE (n.prop1, n.prop2) IS KEY Syntax sicherzustellen.

Von Bedeutung

Eigenschaften, die in Schlüsseleinschränkungen verwendet werden:

  • Darf nicht null sein.
  • Muss wie NOT NULL in den Knotentypen und Edgetypen deklariert werden, die durch die Schlüsseleinschränkung bestimmt sind.