Azure Cosmos DB voor ondersteuning en compatibiliteit van Gremlin-grafieken met TinkerPop-functies

Important

Zoekt u een databaseoplossing voor grootschalige scenario's met een 99.999% SLA (Availability Service Level Agreement), directe automatische schaalaanpassing en automatische failover in meerdere regio's? Overweeg Azure Cosmos DB voor NoSQL.

Wilt u een OLAP-graaf (Online Analytical Processing) implementeren of een bestaande Apache Gremlin-toepassing migreren? Overweeg Graph in Microsoft Fabric.

Azure Cosmos DB ondersteunt Apache Tinkerpop graph traversal language, ook wel Gremlin genoemd. U kunt de Gremlin-taal gebruiken om grafiekentiteiten (hoekpunten en randen) te maken, eigenschappen binnen deze entiteiten te wijzigen, query’s en traversals uit te voeren, en entiteiten te verwijderen.

Azure Cosmos DB Graph-engine volgt nauwgezet de Apache TinkerPop specificatie van doorkruisingsstappen, hoewel er verschillen in de implementatie zijn die specifiek zijn voor Azure Cosmos DB. In dit artikel bieden we een beknopt overzicht van Gremlin en inventariseren we de Gremlin-functies die worden ondersteund door de API voor Gremlin.

Compatibele clientbibliotheken

In de volgende tabel ziet u populaire Gremlin-stuurprogramma's die u kunt gebruiken voor Azure Cosmos DB:

Download Source Aan de slag komen Ondersteunde/aanbevolen connectorversie
.NET Gremlin.NET op GitHub Grafiek maken met behulp van .NET 3.4.13
Java Gremlin JavaDoc Grafiek maken met behulp van Java 3.4.13
Python Gremlin-Python op GitHub Graph maken met behulp van Python 3.4.13
Gremlin-console TinkerPop-documenten Grafiek maken met behulp van de Gremlin-console 3.4.13
Node.js Gremlin-JavaScript op GitHub Grafiek maken met behulp van Node.js 3.4.13
PHP Gremlin-PHP op GitHub Grafiek maken met behulp van PHP 3.1.0
Go Lang Go Lang Deze bibliotheek is gebouwd door externe bijdragers. Het Azure Cosmos DB team biedt geen ondersteuning of onderhoud van de bibliotheek.

Opmerking

Versies van gremlin-clientstuurprogramma's voor 3.5.*, 3.6.* hebben bekende compatibiliteitsproblemen. Daarom raden we u aan de meest recente ondersteunde 3.4.* stuurprogrammaversies te gebruiken die hierboven worden vermeld. Deze tabel wordt bijgewerkt wanneer compatibiliteitsproblemen zijn opgelost voor deze nieuwere stuurprogrammaversies.

Ondersteunde grafiekobjecten

TinkerPop is een standaard die een breed bereik aan grafiektechnologieën beslaat. Daarom is er een standaardterminologie om te beschrijven welke functies worden aangeboden door een graafprovider. Azure Cosmos DB biedt een permanente, hoge gelijktijdigheid, schrijfbare grafiekdatabase die kan worden gepartitioneerd op meerdere servers of clusters.

De volgende tabel bevat de TinkerPop-functies die worden geïmplementeerd door Azure Cosmos DB:

Categorie Azure Cosmos DB implementatie Aantekeningen
Grafiekfuncties Biedt persistentie en gelijktijdige toegang. Ontworpen om transacties te ondersteunen Computermethoden kunnen worden geïmplementeerd via de Spark-connector.
Variabele functies Ondersteunt booleaanse waarde, integer, byte, dubbel, float, long, tekenreeks Biedt ondersteuning voor primitieve typen, is compatibel met complexe typen via een gegevensmodel
Hoekpuntfuncties Biedt ondersteuning voor RemoveVertices, MetaProperties, AddVertices, MultiProperties, StringIds, UserSuppliedIds, AddProperty, RemoveProperty Biedt ondersteuning voor het maken, wijzigen en verwijderen van hoekpunten
Functies voor hoekpunteigenschappen StringIds, UserSuppliedIds, EigenschapToevoegen, EigenschapVerwijderen, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues Biedt ondersteuning voor het maken, wijzigen en verwijderen van hoekpunteigenschappen
Randfuncties AddEdges, RemoveEdges, StringIds, UserSuppliedIds, AddProperty, RemoveProperty Biedt ondersteuning voor het maken, wijzigen en verwijderen van randen
Eigenschappen van randkenmerken Eigenschappen, BooleaanseWaardes, ByteWaardes, DubbeleWaardes, FloatWaardes, GeheleGetalWaardes, LangeWaardes, StringWaardes Biedt ondersteuning voor het maken, wijzigen en verwijderen van randeigenschappen

Gremlin-draadindeling

Azure Cosmos DB gebruikt de JSON-indeling bij het retourneren van resultaten van Gremlin-bewerkingen. Azure Cosmos DB ondersteunt momenteel de JSON-indeling. In het volgende fragment ziet u bijvoorbeeld een JSON-weergave van een hoekpunt geretourneerd naar de client van 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
        }
      ]
    }
  }

De eigenschappen die worden gebruikt door de JSON-indeling voor hoekpunten, worden hieronder beschreven:

Vastgoed Description
id De ID voor het hoekpunt. Moet uniek zijn (in combinatie met de waarde _partition, indien van toepassing). Als er geen waarde wordt opgegeven, wordt deze automatisch opgegeven met een GUID
label Het label van het hoekpunt. Deze eigenschap wordt gebruikt om het entiteitstype te beschrijven.
type Wordt gebruikt om hoekpunten te onderscheiden van niet-Graph-documenten
properties Groep door de gebruiker gedefinieerde eigenschappen die zijn gekoppeld aan het hoekpunt. Elke eigenschap kan meerdere waarden hebben.
_partition De partitiesleutel van het hoekpunt. Gebruikt voor graph-partitionering.
outE Deze eigenschap bevat een lijst met uitlopende randen vanaf een hoekpunt. Het opslaan van informatie over aangrenzing met het hoekpunt zorgt voor een snelle uitvoering van traversals. Randen zijn gegroepeerd op basis van de bijbehorende labels.

Met elke eigenschap kunnen meerdere waarden worden opgeslagen binnen een matrix.

Vastgoed Description
value De waarde van de eigenschap

En de rand bevat de volgende informatie voor hulp bij het navigeren naar andere delen van de grafiek.

Vastgoed Description
id De ID voor de rand. Moet uniek zijn (in combinatie met de waarde _partition, indien van toepassing)
label Het label van de rand. Deze eigenschap is optioneel en wordt gebruikt om het relatietype te beschrijven.
inV Deze eigenschap bevat een lijst met inkomende hoekpunten voor een rand. Het opslaan van informatie over aangrenzing aan de rand zorgt voor een snelle uitvoering van traversals. Hoekpunten zijn gegroepeerd op basis van de bijbehorende labels.
properties Groep door de gebruiker gedefinieerde eigenschappen die zijn gekoppeld aan de rand.

Gremlin-stappen

Laten we nu eens kijken naar de Gremlin-stappen die worden ondersteund door Azure Cosmos DB. Zie TinkerPop-referentie voor een volledige referentie van Gremlin.

stap Description TinkerPop 3.2-documentatie
addE Voegt een rand toe tussen twee hoekpunten stap: addE
addV Voegt een hoekpunt toe aan de grafiek addV-stap
and Zorgt ervoor dat alle traversals een waarde retourneren en stap
as Een stapmodulator om een variabele toe te wijzen aan de uitvoer van een stap als stap
by Een stapmodulator die wordt gebruikt met group en order stap voor stap
coalesce Geeft de eerste traversal terug die een resultaat oplevert coalesce-stap
constant Retourneert een constante waarde. Wordt gebruikt met coalesce stap: constant
count Retourneert het aantal van de traversering stap: count
dedup Retourneert de waarden, zonder de dubbele waarden stap: dedup
drop Verwijdert de waarden (hoekpunt/rand) drop-stap
executionProfile Hiermee wordt een beschrijving gemaakt van alle bewerkingen die zijn gegenereerd door de uitgevoerde Gremlin-stap executionProfile stap
fold Fungeert als barrière waarmee de combinatie van resultaten wordt berekend vouwstap
group Groepeert de waarden op basis van de opgegeven labels groepstap
has Wordt gebruikt om eigenschappen, hoekpunten en randen te filteren. Biedt ondersteuning voor de varianten hasLabel, hasId, hasNot en has. stap: has
inject Waarden invoeren in een stroom stap: inject
is Wordt gebruikt om een filter uit te voeren met behulp van een booleaanse expressie is stap
limit Wordt gebruikt om het aantal items in de traversal te beperken limietstap
local De functie Local verpakt lokaal een gedeelte van een traversal, vergelijkbaar met een subquery. lokale stap
not Wordt gebruikt om de ontkenning van een filter te produceren geen stap
optional Retourneert het resultaat van de opgegeven traversal, indien er een resultaat is, anders wordt het aanroepende element geretourneerd optionele stap
or Zorgt ervoor dat minstens een van de traversals een waarde retourneert stap: or
order Retourneert resultaten in de opgegeven sorteervolgorde bestellingsstap
path Retourneert het volledige pad van de traversal padstap
project Projecteert de eigenschappen als een kaart projectstap
properties Retourneert de eigenschappen voor de opgegeven labels properties-stap
range Filtert op het opgegeven waardenbereik range-stap
repeat Herhaalt de stap zo vaak als is opgegeven. Wordt gebruikt om een lus te maken herhaal stap
sample Wordt gebruikt voor voorbeeldresultaten van de traversal voorbeeldstap
select Wordt gebruikt om resultaten te projecteren van de traversal selecteer stap
store Wordt gebruikt voor niet-blokkerende aggregaten bij traversal store stap
TextP.startingWith(string) Functie voor het filteren van tekenreeksen. Deze functie wordt gebruikt als een predicaat voor de has()-stap om een eigenschap te matchen met het begin van een bepaalde tekenreeks. TextP-predicaten
TextP.endingWith(string) Functie voor het filteren van tekenreeksen. Deze functie wordt gebruikt als een predikaat voor de has()-stap om een eigenschap te laten overeenkomen met het einde van een gegeven tekenreeks. TextP-predicaten
TextP.containing(string) Functie voor het filteren van tekenreeksen. Deze functie wordt gebruikt als een predicaat voor de has()-stap om een eigenschap af te stemmen op de inhoud van een bepaalde tekenreeks. TextP-predicaten
TextP.notStartingWith(string) Functie voor het filteren van tekenreeksen. Deze functie wordt gebruikt als een predicaat voor de has()-stap die gelijk is aan een eigenschap die niet begint met een bepaalde tekenreeks TextP-predicaten
TextP.notEndingWith(string) Functie voor het filteren van tekenreeksen. Deze functie wordt gebruikt als een predicaat voor de has()-stap die gelijk is aan een eigenschap die niet eindigt met een bepaalde tekenreeks TextP-predicaten
TextP.notContaining(string) Functie voor het filteren van tekenreeksen. Deze functie wordt gebruikt als een predicaat voor de has()-stap die gelijk is aan een eigenschap die geen bepaalde tekenreeks bevat TextP-predicaten
tree Paden van een knooppunt verzamelen in een boomstructuur boomstap
unfold Een iterator afrollen als een stap ontvouwen stap
union Resultaten van meerdere traversals samenvoegen union-stap
V Bevat de stappen die nodig zijn voor traversals tussen hoekpunten en randen V, E, out, in, both, outE, inE, bothE, outV, inV, bothV en otherV voor vertexstappen
where Wordt gebruikt om resultaten van de traversal te filteren. Biedt ondersteuning voor de operators eq, neq, lt, lte, gt, gte en between waar stap

De schrijfgeoptimaliseerde engine van Azure Cosmos DB biedt standaard ondersteuning voor het automatisch indexeren van alle eigenschappen binnen knooppunten en randen. Daarom worden query’s met filters, bereikquery’s, sorteringen of combinaties van elke willekeurige eigenschap verwerkt vanaf de index en efficiënt geleverd. Zie ons document over schemaagnostische indexering voor meer informatie over de werking van indexering in Azure Cosmos DB.

Gedragsverschillen

  • Azure Cosmos DB Grafiek-engine voert een breedte-eerst traversering uit, terwijl TinkerPop Gremlin diepte-eerst is. Dit gedrag zorgt voor betere prestaties in horizontaal schaalbaar systeem, zoals Azure Cosmos DB.

Niet-ondersteunde functies

  • Gremlin Bytecode is een programmeertaal-agnostische specificatie voor het doorkruisen van grafieken. Azure Cosmos DB Graph ondersteunt het nog niet. Gebruik GremlinClient.SubmitAsync() en geef traverseren door als een tekenreeks.

  • Instellen van kardinaliteit met property(set, 'xyz', 1) wordt momenteel niet ondersteund. Gebruik in plaats daarvan property(list, 'xyz', 1). Zie Vertex properties with TinkerPop voor meer informatie.

  • De stap match() is momenteel niet beschikbaar. Deze stap biedt declaratieve querymogelijkheden.

  • Objecten als eigenschappen op hoekpunten of zijden worden niet ondersteund. Eigenschappen kunnen alleen primitieve typen of matrices zijn.

  • Sorteren op matrixeigenschappenorder().by(<array property>) wordt niet ondersteund. Alleen sorteren op primitieve typen wordt ondersteund.

  • Niet-primitieve JSON-typen worden niet ondersteund. Gebruik de typen string, number of true/false. null-waarden worden niet ondersteund.

  • GraphSONv3-serialisatiefunctie wordt momenteel niet ondersteund. Gebruik GraphSONv2 Serializer-, Reader- en Writer-klassen in de configuratie van de verbinding. De resultaten die door de Azure Cosmos DB voor Gremlin worden geretourneerd, hebben niet dezelfde indeling als de GraphSON-indeling.

  • Lambda-expressies en functies worden momenteel niet ondersteund. Dit geldt ook voor de functies .map{<expression>}, .by{<expression>}en .filter{<expression>}. Zie A Note on Lambdas voor meer informatie en om te leren hoe u deze functies kunt herschrijven met behulp van Gremlin-stappen.

  • Transacties worden niet ondersteund vanwege de gedistribueerde aard van het systeem. Configureer het juiste consistentiemodel op het Gremlin-account om uw eigen schrijfbewerkingen te lezen en gebruik optimistische gelijktijdigheid om conflicterende schrijfbewerkingen op te lossen.

Bekende beperkingen

  • Indexgebruik voor Gremlin-query's met middelste doorkruisingsstappen.V(): Momenteel maakt alleen de eerste .V() aanroep van een doorkruising gebruik van de index om filters of predicaten die eraan zijn gekoppeld, op te lossen. Bij volgende aanroepen wordt de index niet geraadpleegd, wat de latentie en de kosten van de query zou kunnen verhogen.

Uitgaande van standaardindexering, zou een typische Gremlin-query die begint met de stap .V() in de gekoppelde filterstappen parameters zoals .has() of .where() gebruiken om de kosten en de prestaties van de query te optimaliseren. Voorbeeld:

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

Als er echter meer dan één .V()-stap is opgenomen in de Gremlin-query, is de resolutie van de gegevens voor de query mogelijk niet optimaal. Neem de volgende query als voorbeeld:

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

Met deze query worden twee groepen hoekpunten geretourneerd op basis van hun eigenschap category. In dit geval maakt alleen de eerste aanroep, g.V().has('category', 'A'), gebruik van de index om de hoekpunten op te lossen op basis van de waarden van hun eigenschappen.

Een tijdelijke oplossing voor deze query is het gebruiken van subdoorkruisingsstappen zoals .map() en union(). Hieronder ziet u een voorbeeld:

// 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'))

U kunt de prestaties van de query's bekijken met behulp van de Gremlin-stap executionProfile() .