Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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 daarvanproperty(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 matrixeigenschappen
order().by(<array property>)wordt niet ondersteund. Alleen sorteren op primitieve typen wordt ondersteund.Niet-primitieve JSON-typen worden niet ondersteund. Gebruik de typen
string,numberoftrue/false.null-waarden worden niet ondersteund.GraphSONv3-serialisatiefunctie wordt momenteel niet ondersteund. Gebruik
GraphSONv2Serializer-, 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() .