Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Conformité d'Amazon Neptune avec les normes Gremlin
Les sections suivantes donnent un aperçu de l'implémentation Neptune de Gremlin et de ses différences par rapport à l'implémentation Apache TinkerPop .
Neptune implémente certaines étapes de Gremlin de manière native dans son moteur et utilise l'implémentation Apache TinkerPop Gremlin pour en traiter d'autres (voir). Prise en charge des étapes Gremlin natives dans Amazon Neptune
Note
Pour obtenir des exemples concrets de ces différences implémentation dans la console Gremlin et dans Amazon Neptune, consultez la section Utiliser Gremlin pour accéder aux données graphiques dans Amazon Neptune du Quick Start.
Rubriques
Normes applicables pour Gremlin
Le langage Gremlin est défini par la TinkerPop documentation Apache
et l' TinkerPop implémentation Apache de Gremlin plutôt que par une spécification formelle. Pour les formats numériques, Gremlin suit la norme IEEE 754 (IEEE 754-2019 - IEEE Standard for Arithmetic). Floating-Point
Pour plus d'informations, consultez également la page https://en.wikipedia.org/wiki/IEEE_754 Wikipedia (IEEE 754).
Variables et paramètres dans les scripts
En ce qui concerne les variables pré-limites, l'objet de traversée g se trouve Pre-bound dans Neptune et l'graphobjet n'est pas pris en charge.
Bien que Neptune ne prenne pas en charge les variables Gremlin ni le paramétrage dans des scripts, vous pouvez souvent rencontrer sur Internet des exemples de scripts contenant des déclarations de variables, tels que :
String query = "x = 1; g.V(x)"; List<Result> results = client.submit(query).all().get();
Il existe également de nombreux exemples qui utilisent le paramétrage
Map<String,Object> params = new HashMap<>(); params.put("x",1); String query = "g.V(x)"; List<Result> results = client.submit(query).all().get();
Ces exemples de paramètres sont généralement associés à des avertissements sur les pénalités de performance possibles en cas de non-paramétrage lorsque cela est possible. Il existe de nombreux exemples de ce type TinkerPop que vous pouvez rencontrer, et ils semblent tous assez convaincants quant à la nécessité de paramétrer.
Cependant, la fonction de déclaration de variables et la fonction de paramétrage (ainsi que les avertissements) ne s'appliquent qu'au TinkerPop serveur Gremlin s'il utilise le. GremlinGroovyScriptEngine Elles ne s'appliquent pas lorsque le serveur Gremlin utilise la grammaire gremlin-language ANTLR de Gremlin pour analyser les requêtes. La grammaire ANTLR ne prend en charge ni les déclarations de variables ni le paramétrage. Ainsi, lorsque vous utilisez ANTLR, vous n'avez rien à craindre en cas de non-paramétrage. Étant donné que la grammaire ANTLR est une composante plus récente TinkerPop, les anciens contenus que vous pouvez rencontrer sur Internet ne reflètent généralement pas cette distinction.
Neptune utilise la grammaire ANTLR dans son moteur de traitement des requêtes plutôt que le moteur GremlinGroovyScriptEngine. Il ne prend donc pas en charge les variables, le paramétrage ni la propriété bindings. Par conséquent, les problèmes potentiels liés au non-paramétrage ne s'appliquent pas dans Neptune. Avec Neptune, il est parfaitement sûr de soumettre simplement la requête telle quelle, alors que beaucoup la paramétrerait. Par conséquent, l'exemple précédent peut être simplifié sans aucune perte de performance comme suit :
String query = "g.V(1)"; List<Result> results = client.submit(query).all().get();
Exécution de script
Le moteur Gremlin de Neptune analyse les requêtes à l'aide TinkerPop de la grammaire ANTLR. gremlin-language Il n'exécute pas de GremlinGroovyScriptEngine (comme le font certains déploiements de serveurs TinkerPop-based Gremlin). Les scripts soumis à Neptune doivent donc contenir uniquement le langage Gremlin, et non du code Groovy ou Java arbitraire.
Les scripts peuvent être envoyés à Neptune de différentes manières, par exemple via le point de terminaison Gremlin REST, la console https://docs.aws.amazon.com//neptune/latest/userguide/access-graph-gremlin-console.html Gremlin ou via des pilotes de TinkerPop langage (par exemple, le client de script du pilote Java).
Il est important de ne pas confondre le langage Gremlin lui-même avec le sucre syntaxique ou les fonctions générales de tout langage de programmation que vous avez pu voir encapsuler des exemples de Gremlin ailleurs. Lorsqu'un tel code apparaît dans des TinkerPop didacticiels ou des exemples en ligne, cela dépend d'un environnement d'exécution Groovy ou Java que Neptune ne fournit pas.
Important
Tout ce qui se trouve dans cette section s'applique aux soumissions de Gremlin sous forme de chaînes de texte. Les soumissions de bytecode GLV (Gremlin Language Variant) créées dans un langage hôte tel que Java, Python ou .NET ne sont pas soumises à ces contraintes, car le générateur de parcours en langage hôte produit un bytecode que le moteur de Neptune consomme directement.
Ce que peut contenir un script
-
Toutes les requêtes doivent commencer par
gqui est l'objet de traversée. -
Plusieurs traversées peuvent être émises dans une seule soumission, séparées par un point-virgule (
;) ou un caractère de nouvelle ligne ().\nToutes les instructions autres que la dernière doivent se terminer par une.iterate()étape à exécuter ; seules les données de la traversée finale sont renvoyées.
Référencement de valeurs d' TinkerPop énumération
Lorsqu'une valeur d' TinkerPop énumération est attendue comme argument d'étape (par exemple, une cardinalité activée property() ou une commande activéeby()), utilisez les valeurs abrégées reconnues par la grammaire ANTLR. Neptune ne résout pas les noms de classe Java entièrement qualifiés à cette position. Par exemple, n'org.apache.tinkerpop.gremlin.structure.VertexProperty.Cardinality.singleest pas accepté ; utilisez-le à la single place.
Le tableau suivant répertorie les valeurs abrégées autorisées et la TinkerPop classe sous-jacente à laquelle chacune appartient.
| Valeurs autorisées | Classe |
|---|---|
id, key, label, value |
|
T.id, T.key, T.label, T.value |
|
set, single |
org.apache.tinkerpop.gremlin.structure. VertexProperty.Cardinality |
asc, desc, shuffle |
|
Order.asc, Order.desc, Order.shuffle |
|
global, local |
|
Scope.global, Scope.local |
|
all, first, last, mixed |
|
normSack |
org.apache.tinkerpop.gremlin.process.traversal. SackFunctions.Barrier |
addAll, and, assign, div,
max, min, minus, mult,
or, sum, sumLong |
|
keys, values |
|
BOTH, IN, OUT |
|
any, none |
org.apache.tinkerpop.gremlin.process.traversal.step. TraversalOptionParent.Pick |
Ce qu'un script ne peut pas contenir
Les éléments suivants ne sont pas pris en charge dans les requêtes Gremlin sous forme de chaîne de texte adressées à Neptune, car ils reposent sur le support d'exécution Groovy ou Java que Neptune ne fournit pas :
-
Des déclarations groovy qui ne commencent pas par.
gCela inclut notamment les éléments suivants :Expressions arithmétiques telles que
1 + 1Les appels système tels que
System.nanoTime()Déclarations variables telles que
x = 1; g.V(x)
-
Appels de méthode ou de bibliothèque Java autres que les API Gremlin prises en charge. Par exemple,
java.lang.*,Date()etg.V().tryNext().orElseGet(...)ne sont pas autorisés. -
Méthodes Gremlin qui prennent un type Java comme argument. Ils ne sont accessibles que depuis un JVM-language hôte, pas depuis une soumission de chaîne de texte. Exemples :
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal.program(org.apache.tinkerpop.gremlin.process.computer.VertexProgram)org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal.sideEffect(java.util.function.Consumer)org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal.from(org.apache.tinkerpop.gremlin.structure.Vertex)org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal.to(org.apache.tinkerpop.gremlin.structure.Vertex)
Par exemple, la traversée suivante ne peut pas être soumise sous forme de chaîne de texte :
g.V().addE('something').from(__.V().next()).to(__.V().next()).
Propriétés des éléments
Neptune ne prend pas en charge l'materializePropertiesindicateur qui a été introduit dans la TinkerPop version 3.7.0 pour renvoyer les propriétés des éléments. Par conséquent, Neptune ne renverra toujours que des sommets ou des arêtes comme références avec juste leur id et. label
Séances
Les sessions dans Neptune sont limitées à seulement 10 minutes. Consultez Sessions basées sur des scripts Gremlin et la référence de TinkerPop session
Transactions
Neptune ouvre une nouvelle transaction au début de chaque traversée Gremlin et ferme la transaction lors de la réussite complète de la traversée. La transaction est annulée lorsqu'il y a une erreur.
Plusieurs instructions séparées par un point-virgule (;) ou un caractère de nouvelle ligne (\n) sont incluses dans une seule transaction. Chaque instruction autre que la dernière doit se terminer par une étape next() à exécuter. Seules les données de la traversée finale sont renvoyées.
La logique de transaction manuelle utilisant tx.commit() et tx.rollback() n'est pas prise en charge.
Important
Ceci s'applique uniquement aux méthodes dans lesquelles vous envoyez la requête Gremlin en tant que chaîne de texte (voir Transactions Gremlin).
ID de sommet et ID d'arête
Les ID de sommet et d'arête de Neptune doivent être de type String. Ces chaînes d'ID prennent en charge les caractères Unicode et ne peuvent pas dépasser 55 Mo.
User-supplied Les identifiants sont pris en charge, mais ils sont facultatifs dans le cadre d'une utilisation normale. Si vous ne fournissez pas d'ID lorsque vous ajoutez un sommet ou une arête, Neptune génère un UUID et le convertit en chaîne, sous une forme similaire à celle-ci : "48af8178-50ce-971a-fc41-8c9a954cea62". Ces UUID ne sont pas conformes à la norme RFC. Par conséquent, si vous avez besoin d'UUID standard, vous devrez les générer en externe et les fournir lorsque vous ajouterez des sommets ou des arêtes.
Note
La commande Neptune Load nécessite que vous fournissiez les ID à l'aide du champ ~ id dans le format CSV de Neptune.
User-supplied Identifiants
User-supplied Les pièces d'identité sont autorisées dans Neptune Gremlin avec les stipulations suivantes.
Les ID fournis sont facultatifs.
Seuls les vertex et les edges sont pris en charge.
Seul le type
Stringest pris en charge.
Pour créer un nouveau vertex avec un ID personnalisé, utilisez l'étape property avec le mot-clé id : g.addV().property(id, 'customid').
Note
Ne placez pas de guillemets autour du mot-clé id. Il fait référence à T.id.
Tous les ID vertex et ID edge doivent être uniques. Cependant, Neptune permet d'avoir le même ID pour un sommet et une arête.
Si vous essayez de créer un nouveau vertex à l'aide de g.addV() et qu'il existe déjà un vertex ayant cet ID, l'opération échoue. L'exception à cette règle, c'est que si vous précisez une nouvelle étiquette pour le vertex, l'opération réussit, mais elle ajoute la nouvelle étiquette et toute propriété supplémentaire précisée au sommet existant. Rien n'est remplacé. Un nouveau vertex n'est pas créé. L'ID de sommet ne change pas et reste unique.
Par exemple, les commandes suivantes de la console Gremlin aboutissent :
gremlin> g.addV('label1').property(id, 'customid') gremlin> g.addV('label2').property(id, 'customid') gremlin> g.V('customid').label() ==>label1::label2
ID de propriété de vertex
Les ID de propriété de vertex sont générés automatiquement et peuvent s'afficher comme nombres positifs ou négatifs lors des requêtes.
Cardinalité des propriétés de sommet
Neptune prend en charge la cardinalité définie et la cardinalité unique. Si elle n'est pas spécifiée, la cardinalité définie est sélectionnée. Cela signifie que si vous définissez une valeur de propriété, une nouvelle valeur est ajoutée à la propriété, mais uniquement si elle n'apparaît pas déjà dans l'ensemble de valeurs. Il s'agit de la valeur d'énumération Gremlin Set
List n’est pas pris en charge. Pour plus d'informations sur la cardinalité des propriétés, consultez la rubrique
Mise à jour d'une propriété de sommet
Pour mettre à jour une valeur de propriété sans ajouter une valeur à l'ensemble des valeurs, spécifiez la cardinalité single lors de l'étape property.
g.V('exampleid01').property(single, 'age', 25)
Cela supprime toutes les valeurs existantes de la propriété.
Étiquettes
Neptune prend en charge plusieurs étiquettes pour un sommet. Lorsque vous créez une étiquette, vous pouvez spécifier plusieurs étiquettes en les séparant par ::. Par exemple, g.addV("Label1::Label2::Label3") ajoute un vertex, avec trois étiquettes différentes. L'étape hasLabel associe ce sommet à l'une de ces trois étiquettes : hasLabel("Label1") hasLabel("Label2") et hasLabel("Label3").
Important
Le délimiteur :: est réservé à cet usage uniquement. Vous ne pouvez pas spécifier plusieurs étiquettes dans l'étape hasLabel. Par exemple, hasLabel("Label1::Label2") ne correspond à rien.
Caractères d'échappement
Neptune résout tous les caractères d'échappement comme décrit dans la section Escaping Special Characters
Sérialisation
Neptune prend en charge les sérialisations suivantes en fonction du type MIME demandé.
Avec Neptune, vous pouvez utiliser la plupart des sérialiseurs TinkerPop proposés, qui prennent en charge les différentes versions et configurations de GraphSon et. GraphBinary Consultez le tableau suivant pour les sérialiseurs actuellement pris en charge. Bien que de nombreuses options soient présentes, les conseils à utiliser sont simples :
-
Si vous utilisez des TinkerPop pilotes Apache, préférez le pilote par défaut sans en spécifier un de manière explicite. À moins que vous n'ayez une raison bien précise de le faire, vous n'avez probablement pas besoin de spécifier le sérialiseur lors de l'initialisation de votre pilote. En général, la valeur par défaut utilisée par les pilotes est
application/vnd.graphbinary-v1.0. -
Si vous vous connectez à Neptune via HTTP, donnez la priorité à l'utilisation de,
application/vnd.gremlin-v3.0+json;types=falsecar les types intégrés dans la version alternative de GraphSon 3 compliquent son utilisation. -
Ce n'
application/vnd.graphbinary-v1.0-stringdest généralement utile que lorsqu'il est utilisé conjointement avec la console Gremlin car il convertit tous les résultats en une représentation sous forme de chaîne pour un affichage simple. -
Les autres formats restent présents pour des raisons héritées du passé et ne doivent généralement pas être utilisés avec des pilotes sans raison valable.
| Type MIME | Sérialisation | Configuration |
|
GraphSONUntypedMessageSerializerV1 |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1] |
|
GraphSONMessageSerializerV2 |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2] |
|
GraphSONUntypedMessageSerializerV2 |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2] |
|
GraphSONMessageSerializerV3 |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3] |
|
GraphSONUntypedMessageSerializerV3 |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3] |
|
GraphSONUntypedMessageSerializerV3 |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1] |
|
GraphBinaryMessageSerializerV1 |
|
|
GraphBinaryMessageSerializerV1 |
serializeResultToString: true |
|
GraphSONMessageSerializerGremlinV1 |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1] |
|
GraphSONMessageSerializerV2(fonctionne uniquement avec WebSockets) |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2] |
|
GraphSONMessageSerializerV3 |
|
|
GraphSONMessageSerializerV3 |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3] |
|
GraphBinaryMessageSerializerV1 |
|
Note
Le tableau des sérialiseurs présenté ici fait référence à la dénomination à partir de la version 3.7.0. TinkerPop Si vous souhaitez en savoir plus sur cette modification, consultez la documentation de TinkerPop mise à niveau
Étapes Lambda
Neptune ne prend pas en charge les étapes Lambda.
Étapes Gremlin non prises en charge
Neptune ne prend pas en charge les étapes Gremlin suivantes :
L'étape Gremlin io ()
n'est que partiellement prise en charge dans Neptune. Vous pouvez l'utiliser dans un contexte de lecture, par exemple g.io("https://example.com/data/my-graph.graphml").read(), mais vous ne pouvez pas l'utiliser pour écrire. Pour lire un fichier que vous stockez en tant qu'objet Amazon S3, générez d'abord une URL présignée. Transmettez ensuite cette URL HTTPS àg.io(). Pour plus d'informations sur les URL présignées, voir Télécharger et charger des objets avec des URL présignées dans le guide de l'utilisateur Amazon S3.
Fonctionnalités du graphe Gremlin dans Neptune
L'implémentation Neptune de Gremlin n'expose pas l'objet graph. Les tableaux suivants répertorient les fonctionnalités Gremlin et indiquent si Neptune les prend en charge ou non.
Support de Neptune pour les fonctionnalités graphiques
Les fonctionnalités de graphe Neptune sont les mêmes que celles qui seraient renvoyées par la commande graph.features().
| Fonctionnalité de graphe | Activé ? |
|---|---|
Transactions |
vrai |
ThreadedTransactions |
false |
Computer |
false |
Persistence |
true |
ConcurrentAccess |
true |
Prise en charge Neptune des fonctionnalités de variable
| Fonctionnalité de variable | Activé ? |
|---|---|
Variables |
false |
SerializableValues |
false |
UniformListValues |
false |
BooleanArrayValues |
false |
DoubleArrayValues |
false |
IntegerArrayValues |
false |
StringArrayValues |
false |
BooleanValues |
false |
ByteValues |
false |
DoubleValues |
false |
FloatValues |
false |
IntegerValues |
false |
LongValues |
false |
MapValues |
false |
MixedListValues |
false |
StringValues |
false |
ByteArrayValues |
false |
FloatArrayValues |
false |
LongArrayValues |
false |
Prise en charge Neptune des fonctionnalités de sommet
| Fonctionnalité de sommet | Activé ? |
|---|---|
MetaProperties |
false |
DuplicateMultiProperties |
false |
AddVertices |
true |
RemoveVertices |
true |
MultiProperties |
true |
UserSuppliedIds |
true |
AddProperty |
true |
RemoveProperty |
vrai |
NumericIds |
false |
StringIds |
vrai |
UuidIds |
false |
CustomIds |
false |
AnyIds |
false |
Prise en charge Neptune des fonctionnalités de propriété de sommet
| Fonctionnalité de propriété de sommet | Activé ? |
|---|---|
UserSuppliedIds |
false |
AddProperty |
true |
RemoveProperty |
true |
NumericIds |
true |
StringIds |
vrai |
UuidIds |
false |
CustomIds |
false |
AnyIds |
false |
Properties |
vrai |
SerializableValues |
false |
| UniformListValues | false |
BooleanArrayValues |
false |
DoubleArrayValues |
false |
IntegerArrayValues |
false |
StringArrayValues |
false |
BooleanValues |
true |
ByteValues |
true |
DoubleValues |
true |
FloatValues |
true |
IntegerValues |
true |
LongValues |
vrai |
MapValues |
false |
MixedListValues |
false |
StringValues |
vrai |
ByteArrayValues |
false |
FloatArrayValues |
false |
LongArrayValues |
false |
Prise en charge Neptune des fonctionnalités d'arête
| Fonctionnalité d'arête | Activé ? |
|---|---|
AddEdges |
true |
RemoveEdges |
true |
UserSuppliedIds |
true |
AddProperty |
true |
RemoveProperty |
vrai |
NumericIds |
false |
StringIds |
vrai |
UuidIds |
false |
CustomIds |
false |
AnyIds |
false |
Prise en charge Neptune des fonctionnalités de propriété d'arête
| Fonctionnalité de propriété d'arête | Activé ? |
|---|---|
Properties |
vrai |
SerializableValues |
false |
UniformListValues |
false |
BooleanArrayValues |
false |
DoubleArrayValues |
false |
IntegerArrayValues |
false |
StringArrayValues |
false |
BooleanValues |
true |
ByteValues |
true |
DoubleValues |
true |
FloatValues |
true |
IntegerValues |
true |
LongValues |
vrai |
MapValues |
false |
MixedListValues |
false |
StringValues |
vrai |
ByteArrayValues |
false |
FloatArrayValues |
false |
LongArrayValues |
false |