Unterstützung und Kompatibilität von Gremlin-Diagrammen in Azure Cosmos DB mit TinkerPop-FeaturesAzure Cosmos DB Gremlin graph support and compatibility with TinkerPop features

GILT FÜR: Gremlin-API

Azure Cosmos DB unterstützt die Apache Tinkerpop-Graphdurchlauf-Sprache, auch als Gremlin bezeichnet.Azure Cosmos DB supports Apache Tinkerpop's graph traversal language, known as Gremlin. Mithilfe der Gremlin-Sprache können Sie Diagrammentitäten (Vertices und Edges) erstellen, Eigenschaften innerhalb dieser Entitäten ändern, Abfragen und Traversierungen ausführen und Entitäten löschen.You can use the Gremlin language to create graph entities (vertices and edges), modify properties within those entities, perform queries and traversals, and delete entities.

Die Azure Cosmos DB Graph-Engine hält sich eng an die Apache TinkerPop-Spezifikation für die Durchlaufschritte, es gibt jedoch Azure Cosmos DB-spezifische Unterschiede bei der Implementierung.Azure Cosmos DB Graph engine closely follows Apache TinkerPop traversal steps specification but there are differences in the implementation that are specific for Azure Cosmos DB. Dieser Artikel enthält eine kurze exemplarische Vorgehensweise zu Gremlin und listet die Funktionen von Gremlin auf, die von der Gremlin-API unterstützt werden.In this article, we provide a quick walkthrough of Gremlin and enumerate the Gremlin features that are supported by the Gremlin API.

Kompatible ClientbibliothekenCompatible client libraries

In der folgenden Tabelle werden gängige Gremlin-Treiber aufgeführt, die Sie für Azure Cosmos DB verwenden können:The following table shows popular Gremlin drivers that you can use against Azure Cosmos DB:

DownloadDownload SourceSource Erste SchritteGetting Started Unterstützte Connector-VersionSupported connector version
.NET.NET Gremlin.NET auf GitHubGremlin.NET on GitHub Erstellen von Graph mithilfe von .NETCreate Graph using .NET 3.4.63.4.6
JavaJava Gremlin JavaDocGremlin JavaDoc Erstellen von Graph mithilfe von JavaCreate Graph using Java 3.2.0 und höher3.2.0+
Node.jsNode.js Gremlin-JavaScript auf GitHubGremlin-JavaScript on GitHub Erstellen von Graph mithilfe von Node.jsCreate Graph using Node.js 3.3.4+3.3.4+
PythonPython Gremlin-Python auf GitHubGremlin-Python on GitHub Erstellen von Graph mithilfe von PythonCreate Graph using Python 3.2.73.2.7
PHPPHP Gremlin-PHP auf GitHubGremlin-PHP on GitHub Erstellen von Graph mithilfe von PHPCreate Graph using PHP 3.1.03.1.0
Go LangGo Lang Go LangGo Lang Diese Bibliothek wird von externen Mitwirkenden erstellt.This library is built by external contributors. Das Azure Cosmos DB-Team bietet keine Unterstützung für die Bibliothek, und die Bibliothek wird nicht vom Azure Cosmos DB-Team gewartet.The Azure Cosmos DB team doesn't offer any support or maintain the library.
Gremlin-KonsoleGremlin console TinkerPop-DokumenteTinkerPop docs Erstellen von Graph mithilfe der Gremlin-KonsoleCreate Graph using Gremlin Console 3.2.0 und höher3.2.0 +

Unterstützte Graph-ObjekteSupported Graph Objects

TinkerPop ist ein Standard, der eine große Bandbreite an Diagrammtechnologien abdeckt.TinkerPop is a standard that covers a wide range of graph technologies. Daher weist diese Standardterminologie auf, die beschreiben, welche Funktionen von einem Diagrammanbieter bereitgestellt werden.Therefore, it has standard terminology to describe what features are provided by a graph provider. Azure Cosmos DB stellt eine beständige und beschreibbare Diagrammdatenbank mit hoher Parallelität dar, die über mehrere Server oder Cluster hinweg partitioniert werden kann.Azure Cosmos DB provides a persistent, high concurrency, writeable graph database that can be partitioned across multiple servers or clusters.

Die folgende Tabelle enthält die TinkerPop-Funktionen, die von Azure Cosmos DB implementiert werden:The following table lists the TinkerPop features that are implemented by Azure Cosmos DB:

CategoryCategory Implementierung von Azure Cosmos DBAzure Cosmos DB implementation NotizenNotes
DiagrammfunktionenGraph features Stellen Persistenz und ConcurrentAccess bereit.Provides Persistence and ConcurrentAccess. Sind zur Unterstützung für Transaktionen ausgelegt.Designed to support Transactions Computermethoden können über den Spark-Connector implementiert werden.Computer methods can be implemented via the Spark connector.
VariablenfunktionenVariable features Unterstützen Boolean-, Integer-, Byte-, Double-, Float-, Long- und String-DatentypenSupports Boolean, Integer, Byte, Double, Float, Integer, Long, String Unterstützen primitive Typen; ist mit komplexen Typen über Datenmodelle kompatibelSupports primitive types, is compatible with complex types via data model
Vertex-FunktionenVertex features Unterstützen RemoveVertices MetaProperties, AddVertices MultiProperties, StringIds UserSuppliedIds, AddProperty, RemovePropertySupports RemoveVertices, MetaProperties, AddVertices, MultiProperties, StringIds, UserSuppliedIds, AddProperty, RemoveProperty Unterstützen die Erstellung, Änderung und Löschung von VerticesSupports creating, modifying, and deleting vertices
Vertex-Eigenschafts-FunktionenVertex property features StringIds, UserSuppliedIds, AddProperty, RemoveProperty, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValuesStringIds, UserSuppliedIds, AddProperty, RemoveProperty, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues Unterstützen die Erstellung, Änderung und Löschung von Vertex-EigenschaftenSupports creating, modifying, and deleting vertex properties
EdgefunktionenEdge features AddEdges, RemoveEdges, StringIds, UserSuppliedIds, AddProperty, RemovePropertyAddEdges, RemoveEdges, StringIds, UserSuppliedIds, AddProperty, RemoveProperty Unterstützen die Erstellung, Änderung und Löschung von EdgesSupports creating, modifying, and deleting edges
Edge-Eigenschafts-FunktionenEdge property features Properties, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValuesProperties, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues Unterstützen die Erstellung, Änderung und Löschung von Edge-EigenschaftenSupports creating, modifying, and deleting edge properties

Gremlin-SendeformatGremlin wire format

Azure Cosmos DB verwendet bei der Rückgabe von Ergebnissen aus Gremlin-Vorgängen das JSON-Format.Azure Cosmos DB uses the JSON format when returning results from Gremlin operations. Von Azure Cosmos DB wird aktuell das JSON-Format unterstützt.Azure Cosmos DB currently supports the JSON format. Der folgende Ausschnitt zeigt beispielsweise eine JSON-Darstellung eines Vertex, der von Azure Cosmos DB an den Client zurückgegeben wurde:For example, the following snippet shows a JSON representation of a vertex returned to the client from Azure Cosmos DB:

  {
    "id": "a7111ba7-0ea1-43c9-b6b2-efc5e3aea4c0",
    "label": "person",
    "type": "vertex",
    "outE": {
      "knows": [
        {
          "id": "3ee53a60-c561-4c5e-9a9f-9c7924bc9aef",
          "inV": "04779300-1c8e-489d-9493-50fd1325a658"
        },
        {
          "id": "21984248-ee9e-43a8-a7f6-30642bc14609",
          "inV": "a8e3e741-2ef7-4c01-b7c8-199f8e43e3bc"
        }
      ]
    },
    "properties": {
      "firstName": [
        {
          "value": "Thomas"
        }
      ],
      "lastName": [
        {
          "value": "Andersen"
        }
      ],
      "age": [
        {
          "value": 45
        }
      ]
    }
  }

Im Anschluss werden die Eigenschaften beschrieben, die im JSON-Format für Vertices verwendet werden:The properties used by the JSON format for vertices are described below:

EigenschaftProperty BeschreibungDescription
id Die ID für den Vertex.The ID for the vertex. Muss eindeutig sein (in Kombination mit dem Wert von _partition, falls zutreffend).Must be unique (in combination with the value of _partition if applicable). Wird kein Wert angegeben, wird automatisch eine GUID bereitgestellt.If no value is provided, it will be automatically supplied with a GUID
label Die Bezeichnung des Vertex.The label of the vertex. Diese Eigenschaft dient zur Beschreibung des Entitätstyps.This property is used to describe the entity type.
type Dient zur Unterscheidung von Vertices von anderen Dokumenten, die keine Diagramme sind.Used to distinguish vertices from non-graph documents
properties Sammlung von benutzerdefinierten Eigenschaften in Verbindung mit dem Vertex.Bag of user-defined properties associated with the vertex. Jede Eigenschaft kann mehrere Werte enthalten.Each property can have multiple values.
_partition Der Partitionsschlüssel des Vertex.The partition key of the vertex. Wird für Graphpartitionierung verwendet.Used for graph partitioning.
outE Diese Eigenschaft enthält eine Liste von externen Edges aus einem Vertex.This property contains a list of out edges from a vertex. Die Speicherung von Informationen zur Nähe zum Vertex ermöglicht die schnelle Ausführung von Traversierungen.Storing the adjacency information with vertex allows for fast execution of traversals. Edges werden basierend auf deren Bezeichnungen gruppiert.Edges are grouped based on their labels.

Zudem enthalten Edges folgende Informationen, die die Navigation in anderen Teilen des Diagramms unterstützen können.And the edge contains the following information to help with navigation to other parts of the graph.

EigenschaftProperty BeschreibungDescription
id Die ID für den Edge.The ID for the edge. Muss eindeutig sein (in Kombination mit dem Wert von _partition, falls zutreffend).Must be unique (in combination with the value of _partition if applicable)
label Die Bezeichnung des Edge.The label of the edge. Diese Eigenschaft ist optional, und dient zur Beschreibung des Beziehungstyps.This property is optional, and used to describe the relationship type.
inV Diese Eigenschaft enthält eine Liste von In-Vertices für einen Edge.This property contains a list of in vertices for an edge. Die Speicherung von Informationen über die Nähe zum Vertex mit dem Edge ermöglicht die schnelle Ausführung von Traversierungen.Storing the adjacency information with the edge allows for fast execution of traversals. Vertices werden basierend auf ihren Bezeichnungen gruppiert.Vertices are grouped based on their labels.
properties Sammlung von benutzerdefinierten Eigenschaften in Verbindung mit dem Edge.Bag of user-defined properties associated with the edge. Jede Eigenschaft kann mehrere Werte enthalten.Each property can have multiple values.

Jede Eigenschaft kann mehrere Werte in einem Array speichern.Each property can store multiple values within an array.

EigenschaftProperty BeschreibungDescription
value Wert der EigenschaftThe value of the property

Gremlin-SchritteGremlin steps

Sehen wir uns nun die Gremlin-Schritte an, die von Azure Cosmos DB unterstützt werden.Now let's look at the Gremlin steps supported by Azure Cosmos DB. Eine vollständige Referenz zu Gremlin finden Sie in der TinkerPop-Referenz.For a complete reference on Gremlin, see TinkerPop reference.

Schrittstep BeschreibungDescription Dokumentation zu TinkerPop 3.2TinkerPop 3.2 Documentation
addE Fügt einen Edge zwischen zwei Vertices hinzuAdds an edge between two vertices addE-SchrittaddE step
addV Fügt einen Vertex zum Diagramm hinzuAdds a vertex to the graph addV-SchrittaddV step
and Stellt sicher, dass alle Traversierungen einen Wert zurückgebenEnsures that all the traversals return a value and-Schrittand step
as Ein Schrittmodulator für die Zuweisung einer Variable zur Ausgabe eines SchrittsA step modulator to assign a variable to the output of a step as-Schrittas step
by Ein mit group und order verwendeter SchrittmodulatorA step modulator used with group and order by-Schrittby step
coalesce Gibt die erste Traversierung, die ein Ergebnis zurückgibt, zurückReturns the first traversal that returns a result coalesce-Schrittcoalesce step
constant Gibt einen konstanten Wert zurück.Returns a constant value. Wird mit coalesce verwendet.Used with coalesce constant-Schrittconstant step
count Gibt die Anzahl aus der Traversierung zurückReturns the count from the traversal count-Schrittcount step
dedup Gibt die Werte mit entfernten Duplikaten zurückReturns the values with the duplicates removed dedup-Schrittdedup step
drop Löscht die Werte (Vertex/Edge)Drops the values (vertex/edge) drop-Schrittdrop step
executionProfile Erstellt eine Beschreibung aller Vorgänge, die im ausgeführten Gremlin-Schritt generiert werden.Creates a description of all operations generated by the executed Gremlin step executionProfile-SchrittexecutionProfile step
fold Fungiert als Grenze, die Ergebnisse berechnet und zusammenfasstActs as a barrier that computes the aggregate of results fold-Schrittfold step
group Gruppiert die Werte basierend auf den angegebenen BezeichnungenGroups the values based on the labels specified group-Schrittgroup step
has Wird zum Filtern von Eigenschaften, Vertices und Edges verwendet.Used to filter properties, vertices, and edges. Unterstützt die Varianten hasLabel, hasId, hasNot und has.Supports hasLabel, hasId, hasNot, and has variants. has-Schritthas step
inject Fügt Werte in einen Stream einInject values into a stream inject-Schrittinject step
is Dient zur Ausführung eines Filters mithilfe eines booleschen AusdrucksUsed to perform a filter using a boolean expression is-Schrittis step
limit Dient zur Beschränkung der Anzahl der Elemente in der TraversierungUsed to limit number of items in the traversal limit-Schrittlimit step
local Umschließt lokal einen Abschnitt einer Traversierung, ähnlich wie bei einer UnterabfrageLocal wraps a section of a traversal, similar to a subquery local-Schrittlocal step
not Dient zur Negierung eines FiltersUsed to produce the negation of a filter not-Schrittnot step
optional Gibt das Ergebnis der angegebenen Traversierung zurück, wenn diese ein anderes Ergebnis als das vom aufrufenden Element zurückgegebene Ergebnis liefertReturns the result of the specified traversal if it yields a result else it returns the calling element optional-Schrittoptional step
or Stellt sicher, dass mindestens einer der Traversierungen einen Wert zurückgibtEnsures at least one of the traversals returns a value or-Schrittor step
order Gibt die Ergebnisse in der angegebenen Sortierreihenfolge zurückReturns results in the specified sort order order-Schrittorder step
path Gibt den vollständigen Pfad der Traversierung zurückReturns the full path of the traversal path-Schrittpath step
project Projiziert die Eigenschaften als KarteProjects the properties as a Map project-Schrittproject step
properties Gibt die Eigenschaften für die angegebenen Bezeichnungen zurückReturns the properties for the specified labels properties-Schrittproperties step
range Filtert auf den angegebenen WertebereichFilters to the specified range of values range-Schrittrange step
repeat Wiederholt den Schritt für die angegebene Anzahl von Versuchen.Repeats the step for the specified number of times. Wird für die Ausführung als Schleife verwendet.Used for looping repeat-Schrittrepeat step
sample Wird zum Testen von Ergebnissen aus der Traversierung verwendetUsed to sample results from the traversal sample-Schrittsample step
select Wird zum Projizieren von Ergebnissen aus der Traversierung verwendetUsed to project results from the traversal select-Schrittselect step
store Wird für nicht blockierende Aggregate aus der Traversierung verwendetUsed for non-blocking aggregates from the traversal store-Schrittstore step
TextP.startingWith(string) Filterfunktion für Zeichenfolgen.String filtering function. Diese Funktion dient als ein Prädikat für den Schritt has(), um eine Eigenschaft mit dem Anfang einer bestimmten Zeichenfolge zu finden.This function is used as a predicate for the has() step to match a property with the beginning of a given string TextP-PrädikateTextP predicates
TextP.endingWith(string) Filterfunktion für Zeichenfolgen.String filtering function. Diese Funktion dient als ein Prädikat für den Schritt has(), um eine Eigenschaft mit dem Ende einer bestimmten Zeichenfolge zu finden.This function is used as a predicate for the has() step to match a property with the ending of a given string TextP-PrädikateTextP predicates
TextP.containing(string) Filterfunktion für Zeichenfolgen.String filtering function. Diese Funktion dient als ein Prädikat für den Schritt has(), um eine Eigenschaft mit dem Inhalt einer bestimmten Zeichenfolge zu finden.This function is used as a predicate for the has() step to match a property with the contents of a given string TextP-PrädikateTextP predicates
TextP.notStartingWith(string) Filterfunktion für Zeichenfolgen.String filtering function. Diese Funktion dient als ein Prädikat für den Schritt has(), um eine Eigenschaft zu finden, die nicht mit einer bestimmten Zeichenfolge beginnt.This function is used as a predicate for the has() step to match a property that doesn't start with a given string TextP-PrädikateTextP predicates
TextP.notEndingWith(string) Filterfunktion für Zeichenfolgen.String filtering function. Diese Funktion dient als ein Prädikat für den Schritt has(), um eine Eigenschaft zu finden, die nicht auf eine bestimmte Zeichenfolge endet.This function is used as a predicate for the has() step to match a property that doesn't end with a given string TextP-PrädikateTextP predicates
TextP.notContaining(string) Filterfunktion für Zeichenfolgen.String filtering function. Diese Funktion dient als ein Prädikat für den Schritt has(), um eine Eigenschaft zu finden, die eine bestimmte Zeichenfolge nicht enthält.This function is used as a predicate for the has() step to match a property that doesn't contain a given string TextP-PrädikateTextP predicates
tree Aggregiert Pfade aus einem Vertex in einer StrukturAggregate paths from a vertex into a tree tree-Schritttree step
unfold Löst einen Iterator als Schritt aufUnroll an iterator as a step unfold-Schrittunfold step
union Führt Ergebnisse aus mehreren Traversierungen zusammenMerge results from multiple traversals union-Schrittunion step
V Enthält die erforderlichen Schritte für Traversierungen zwischen Vertices und Edges: V, E, out, in, both, outE, inE, bothE, outV, inV, bothV und otherV fürIncludes the steps necessary for traversals between vertices and edges V, E, out, in, both, outE, inE, bothE, outV, inV, bothV, and otherV for vertex-Schrittevertex steps
where Wird zum Filtern von Ergebnissen aus der Traversierung verwendet.Used to filter results from the traversal. Unterstützt die Operatoren eq, neq, lt, lte, gt, gte und between.Supports eq, neq, lt, lte, gt, gte, and between operators where-Schrittwhere step

Die von Azure Cosmos DB bereitgestellte, für Schreibvorgänge optimierte Engine unterstützt standardmäßig die automatische Indizierung aller Eigenschaften in Vertices und Edges.The write-optimized engine provided by Azure Cosmos DB supports automatic indexing of all properties within vertices and edges by default. Daher werden Abfragen mit Filtern, Bereichsabfragen, Sortierungen oder Aggregate von Eigenschaften über den Index verarbeitet und effizient übermittelt.Therefore, queries with filters, range queries, sorting, or aggregates on any property are processed from the index, and served efficiently. Weitere Informationen zur Indizierung in Azure Cosmos DB finden Sie in unserem Dokument unter Schemagnostische Indizierung.For more information on how indexing works in Azure Cosmos DB, see our paper on schema-agnostic indexing.

Unterschiede im VerhaltenBehavior differences

  • Die Azure Cosmos DB Graph-Engine führt einen Durchlauf mit breitem Ansatz aus, während TinkerPop Gremlin einen „tiefen“ Ansatz verfolgt.Azure Cosmos DB Graph engine runs breadth-first traversal while TinkerPop Gremlin is depth-first. Dieses Verhalten erzielt eine bessere Leistung in einem horizontal skalierbaren System wie Cosmos DB.This behavior achieves better performance in horizontally scalable system like Cosmos DB.

Nicht unterstützte FunktionenUnsupported features

  • Gremlin Bytecode ist eine von der Programmiersprache unabhängige Spezifikation für Diagrammdurchläufe.Gremlin Bytecode is a programming language agnostic specification for graph traversals. Cosmos DB Graph unterstützt dies noch nicht.Cosmos DB Graph doesn't support it yet. Verwenden Sie GremlinClient.SubmitAsync(), und übergeben Sie den Durchlauf als eine Textzeichenfolge.Use GremlinClient.SubmitAsync() and pass traversal as a text string.

  • property(set, 'xyz', 1): Das Festlegen der Kardinalität wird noch nicht unterstützt.property(set, 'xyz', 1) set cardinality isn't supported today. Verwenden Sie stattdessen property(list, 'xyz', 1).Use property(list, 'xyz', 1) instead. Weitere Informationen finden Sie unter Vertex-Eigenschaften mit TinkerPop.To learn more, see Vertex properties with TinkerPop.

  • Der Schritt match() ist derzeit nicht verfügbar.The match() step isn't currently available. Dieser Schritt bietet deklarative Abfragefunktionen.This step provides declarative querying capabilities.

  • Objekte als Eigenschaften werden für Vertices und Edges nicht unterstützt.Objects as properties on vertices or edges aren't supported. Eigenschaften können nur primitive Typen oder Arrays sein.Properties can only be primitive types or arrays.

  • Sortieren nach Arrayeigenschaften order().by(<array property>) wird nicht unterstützt.Sorting by array properties order().by(<array property>) isn't supported. Die Sortierung wird nur von primitiven Typen unterstützt.Sorting is supported only by primitive types.

  • Nicht primitive JSON-Typen werden nicht unterstützt.Non-primitive JSON types aren't supported. Verwenden Sie die Typen string, number oder true/false.Use string, number, or true/false types. null-Werte werden nicht unterstützt.null values aren't supported.

  • Das GraphSONv3-Serialisierungsmodul wird derzeit noch nicht unterstützt.GraphSONv3 serializer isn't currently supported. Verwenden Sie das GraphSONv2-Serialisierungsmodul sowie Reader- und Writerklassen in der Verbindungskonfiguration.Use GraphSONv2 Serializer, Reader, and Writer classes in the connection configuration. Das Format der von der Azure Cosmos DB Gremlin-API zurückgegebenen Ergebnisse ist nicht identisch mit dem GraphSON-Format.The results returned by the Azure Cosmos DB Gremlin API don't have the same format as the GraphSON format.

  • Lambdaausdrücke und -funktionen werden derzeit nicht unterstützt.Lambda expressions and functions aren't currently supported. Dies umfasst die Funktionen .map{<expression>}, .by{<expression>} und .filter{<expression>}.This includes the .map{<expression>}, the .by{<expression>}, and the .filter{<expression>} functions. Weitere Informationen und wie Sie sie mithilfe der Gremlin-Schritte neu schreiben können, finden Sie unter A Note on Lambdas (Hinweis zu Lambdas).To learn more, and to learn how to rewrite them using Gremlin steps, see A Note on Lambdas.

  • Transaktionen werden aufgrund der verteilten Natur des Systems nicht unterstützt.Transactions aren't supported because of distributed nature of the system. Konfigurieren Sie ein geeignetes Konsistenzmodell für das Gremlin-Konto, um „Ihre eigenen Schreibvorgänge zu lesen“, und verwenden Sie optimistische Nebenläufigkeit, um Schreibvorgänge aufzulösen, zu einen Konflikt verursachen.Configure appropriate consistency model on Gremlin account to "read your own writes" and use optimistic concurrency to resolve conflicting writes.

Bekannte EinschränkungenKnown limitations

  • Indexverwendung für Gremlin-Abfragen mit Schritten vom Typ .V() während des Durchlaufs: Aktuell wird nur beim ersten .V()-Aufruf eines Durchlaufs der Index genutzt, um alle angefügten Filter oder Prädikate aufzulösen.Index utilization for Gremlin queries with mid-traversal .V() steps: Currently, only the first .V() call of a traversal will make use of the index to resolve any filters or predicates attached to it. Bei späteren Aufrufen wird der Index nicht herangezogen, wodurch sich die Wartezeit und die Kosten der Abfrage erhöhen können.Subsequent calls will not consult the index, which might increase the latency and cost of the query.

Bei Verwendung der Standardindizierung werden von einer typischen Gremlin-Leseabfrage, die mit dem Schritt .V() beginnt, Parameter wie .has() oder .where() in den angefügten Filterschritten verwendet, um die Kosten und die Leistung der Abfrage zu optimieren.Assuming default indexing, a typical read Gremlin query that starts with the .V() step would use parameters in its attached filtering steps, such as .has() or .where() to optimize the cost and performance of the query. Beispiel:For example:

g.V().has('category', 'A')

Enthält die Gremlin-Abfrage allerdings mehrere Schritte vom Typ .V(), ist die Auflösung der Daten für die Abfrage möglicherweise nicht optimal.However, when more than one .V() step is included in the Gremlin query, the resolution of the data for the query might not be optimal. Ein Beispiel hierfür wäre etwa die folgende Abfrage:Take the following query as an example:

g.V().has('category', 'A').as('a').V().has('category', 'B').as('b').select('a', 'b')

Diese Abfrage gibt auf der Grundlage der Eigenschaft category zwei Gruppen von Vertices zurück.This query will return two groups of vertices based on their property called category. In diesem Fall wird nur beim ersten Aufruf (g.V().has('category', 'A')) der Index genutzt, um die Vertices auf der Grundlage der Werte ihrer Eigenschaften aufzulösen.In this case, only the first call, g.V().has('category', 'A') will make use of the index to resolve the vertices based on the values of their properties.

Zur Umgehung dieses Problems können bei dieser Abfrage untergeordnete Durchlaufschritte wie .map() und union() verwendet werden.A workaround for this query is to use subtraversal steps such as .map() and union(). Beispiel:This is exemplified below:

// Query workaround using .map()
g.V().has('category', 'A').as('a').map(__.V().has('category', 'B')).as('b').select('a','b')

// Query workaround using .union()
g.V().has('category', 'A').fold().union(unfold(), __.V().has('category', 'B'))

Die Leistung der Abfragen kann mithilfe des GremlinexecutionProfile()-Schritts überprüft werden.You can review the performance of the queries by using the Gremlin executionProfile() step.

Nächste SchritteNext steps