View a markdown version of this page

Schéma du graphe de propriétés - Amazon Neptune

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.

Schéma du graphe de propriétés

Le neptune.graph.pg_schema() Cette procédure fournit une vue d'ensemble complète de la structure de votre graphe de propriétés. Il renvoie toutes les étiquettes de nœuds, les étiquettes de bords, les propriétés avec leurs types de données et les triplets d'étiquettes ({~from, ~type, ~to} modèles qui décrivent comment les types de nœuds se connectent via les types d'arêtes).

Cette procédure est actuellement disponible uniquement via le point de terminaison OpenCypher et découvre le schéma de toutes les données des graphes de propriétés.

Utilisez cette procédure pour des tâches telles que :

  • Génération de requêtes AI et LLM — Donnez aux LLM la structure graphique dont ils ont besoin pour générer des requêtes Cypher valides à partir du langage naturel (Text-to-Cypher, applications GraphRag).

  • Visualisation et exploration de graphiques — Des outils tels que Explorateur de graphes utilisez les informations du schéma pour créer des représentations visuelles interactives des données graphiques sans avoir à scanner l'intégralité de la base de données.

  • Découverte du schéma de l'application — Les applications qui ont besoin de comprendre la structure des graphes au démarrage, telles que les générateurs de schémas GraphQL ou les outils de validation des données.

Comparaison avec Neptune Analytics

Dans Neptune Analytics, neptune.graph.pg_schema() est synchrone. Il calcule le schéma à chaque appel.

Dans la base de données Neptune, vous déclenchez explicitement un calcul de schéma asynchrone en appelant neptune.graph.pg_schema.compute(), qui revient immédiatement. Le calcul s'exécute en arrière-plan pendant que vous interrogez pour terminer le sondage à l'aide de neptune.graph.pg_schema(). Une fois calculé, Neptune conserve le schéma et le renvoie instantanément lors des lectures suivantes sans recalcul. Des résultats partiels sont également disponibles alors que le calcul est toujours en cours. Vous pouvez également arrêter un calcul en cours et le reprendre ultérieurement.

Comparaison avec l'API Graph Summary

Le API de résumé des graphiques ne fournit pas de triplets d'étiquettes ni de types de données de propriété. La procédure de schéma du graphe de propriétés comble cette lacune. Les triplets d'étiquettes indiquent les modèles de relation spécifiques de votre graphique. Par exemple, un Person se connecte à Company via un worksAt bord. Ces informations sont essentielles pour que les LLM puissent générer des requêtes sémantiquement correctes.

Conditions préalables

Version de moteur

La procédure de schéma du graphe de propriétés nécessite la version 1.4.8.0 ou ultérieure du moteur Neptune.

Autorisations IAM

Les actions IAM suivantes sont requises pour chaque opération de schéma :

  • CALL neptune.graph.pg_schema() — nécessite neptune-db:ReadDataViaQuery.

  • CALL neptune.graph.pg_schema.compute() — nécessite neptune-db:ReadDataViaQuery et neptune-db:WriteDataViaQuery.

  • CALL neptune.graph.pg_schema.stop() — nécessite neptune-db:ReadDataViaQuery et neptune-db:WriteDataViaQuery.

Le compute() et stop() les opérations nécessitent des autorisations d'écriture car elles modifient l'état interne utilisé pour mettre en cache et conserver le schéma.

Exemple Exemple de politique IAM

La politique suivante accorde les autorisations minimales requises pour toutes les opérations de schéma :

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "neptune-db:ReadDataViaQuery", "neptune-db:WriteDataViaQuery" ], "Resource": "arn:aws:neptune-db:us-east-1:123456789012:cluster-resource-id/*" }] }

Pour accorder un accès en lecture seule au schéma (sans possibilité de déclencher le calcul), utilisez uniquement neptune-db:ReadDataViaQuery.

Instances pour les rédacteurs et les lecteurs

Vous ne pouvez déclencher le calcul du schéma que sur l'instance d'écriture. Les instances de réplication en lecture peuvent lire le schéma (qui est répliqué depuis l'enregistreur) mais ne peuvent pas s'exécuter compute() ou stop().

Référence des API

Lire le schéma

Récupère le schéma actuel et l'état du calcul.

Syntaxe :

AWS CLI
aws neptunedata execute-open-cypher-query \ --endpoint-url https://your-neptune-endpoint:port \ --open-cypher-query "CALL neptune.graph.pg_schema()"
SDK
import boto3 from botocore.config import Config client = boto3.client( 'neptunedata', endpoint_url='https://your-neptune-endpoint:port', config=Config(read_timeout=None, retries={'total_max_attempts': 1}) ) response = client.execute_open_cypher_query( openCypherQuery='CALL neptune.graph.pg_schema()' ) print(response)
awscurl
awscurl -X POST https://your-neptune-endpoint:port/openCypher \ -H "Content-Type: application/x-www-form-urlencoded" \ --region us-east-1 --service neptune-db \ -d 'query=CALL neptune.graph.pg_schema()'

Comportement : Renvoie immédiatement le schéma et l'état actuels. Toujours non bloquant. Si aucun schéma n'a été calculé, renvoie l'état : "NotStarted" avec des champs de schéma vides. Si un calcul est en cours, renvoie des résultats partiels avec l'état : "InProgress".

Format de réponse :

La réponse contient un objet de schéma avec les champs suivants :

Objet d'état :

  • state (String) — État actuel du cycle de vie : NotStarted, InProgress, Completed, Stopped, Failed. À partir de la version 1.5.0.0 du moteur Neptune, un calcul interrompu peut également signaler Paused. Pour plus d'informations, voir États.

  • concurrency (String) — Nombre de threads utilisés pour le calcul. 0 signifie automatique (déterminé en fonction du matériel). Plage : 1 (la plus faible) à 16 (la plus élevée).

  • lastComputedTimestamp (Chaîne) — ISO-8601 Horodatage UTC du dernier calcul réussi (par exemple, 2026-05-29T08:00:00Z)

  • progressPercentage (String) — Progression du calcul : 0 lorsqu'il n'est pas démarré, 0—99 pendant le calcul, 100 lorsqu'il est terminé

  • errorMessage (String) — La raison pour laquelle une demande a été rejetée ou pour laquelle le calcul est Paused ou Failed. Par exemple, un redémarrage ou un basculement a interrompu le calcul, ou le calcul a échoué.

Objet du schéma :

  • nodeLabels — Tableau de toutes les étiquettes de nœuds uniques dans le graphique

  • edgeLabels — Tableau de toutes les étiquettes de bord uniques dans le graphique

  • nodeLabelDetails — Pour chaque étiquette de nœud : propriétés et leurs types de données

  • edgeLabelDetails — Pour chaque étiquette de bord : propriétés et leurs types de données

  • labelTriples — Éventail de modèles relationnels : {~from, ~type, ~to} décrivant quels types de nœuds se connectent via quels types d'arêtes

Types de données pris en charge : String, Int, Long, Double, Bool, Date

Si une propriété possède plusieurs types de données sur différents nœuds (par exemple, certains nœuds stockent age comme Int et d'autres comme String), tous les types observés sont répertoriés dans le datatypes tableau.

Schéma de calcul

Déclenche un calcul de schéma en arrière-plan.

Syntaxe :

AWS CLI
aws neptunedata execute-open-cypher-query \ --endpoint-url https://your-neptune-endpoint:port \ --open-cypher-query "CALL neptune.graph.pg_schema.compute()"

Avec un paramètre de simultanéité optionnel :

aws neptunedata execute-open-cypher-query \ --endpoint-url https://your-neptune-endpoint:port \ --open-cypher-query "CALL neptune.graph.pg_schema.compute({concurrency: 2})"
SDK
import boto3 from botocore.config import Config client = boto3.client( 'neptunedata', endpoint_url='https://your-neptune-endpoint:port', config=Config(read_timeout=None, retries={'total_max_attempts': 1}) ) response = client.execute_open_cypher_query( openCypherQuery='CALL neptune.graph.pg_schema.compute()' ) print(response)
awscurl
awscurl -X POST https://your-neptune-endpoint:port/openCypher \ -H "Content-Type: application/x-www-form-urlencoded" \ --region us-east-1 --service neptune-db \ -d 'query=CALL neptune.graph.pg_schema.compute()'

Avec un paramètre de simultanéité optionnel :

awscurl -X POST https://your-neptune-endpoint:port/openCypher \ -H "Content-Type: application/x-www-form-urlencoded" \ --region us-east-1 --service neptune-db \ -d 'query=CALL neptune.graph.pg_schema.compute({concurrency: 2})'

Actions IAM requises : neptune-db:ReadDataViaQuery et neptune-db:WriteDataViaQuery

Paramètres :

  • concurrency (Nombre entier, facultatif) — Nombre de threads pour le calcul en arrière-plan. 0 (par défaut) = déterminé automatiquement en fonction du matériel. Plage : 1 (la plus faible) à 16 (la plus élevée). Utilisez des valeurs plus faibles pour les instances plus petites afin de réduire l'impact sur les ressources.

Comportement :

  • Retourne immédiatement avec le statut actuel. Le calcul s'exécute de manière asynchrone en arrière-plan.

  • S'il est appelé alors que l'état est Stopped ou Paused, le calcul reprend là où il s'était arrêté. Pour plus de détails sur ces états, voir États.

  • S'il est appelé alors que l'état est Completed, lance un nouveau recalcul. Le schéma précédent continue à effectuer des lectures jusqu'à ce que le nouveau calcul soit terminé.

  • S'il est appelé alors qu'un calcul est déjà effectué InProgress, Neptune rejette la demande avec un message d'erreur.

  • Si elle est appelée pendant un chargement groupé actif, Neptune rejette la demande avec un message d'erreur.

Réponse : Renvoie l'objet d'état indiquant l'état : "InProgress" avec le concurrency et progressPercentage champs.

Arrêter le calcul du schéma

Arrête un calcul en arrière-plan en cours d'exécution.

Syntaxe :

AWS CLI
aws neptunedata execute-open-cypher-query \ --endpoint-url https://your-neptune-endpoint:port \ --open-cypher-query "CALL neptune.graph.pg_schema.stop()"
SDK
import boto3 from botocore.config import Config client = boto3.client( 'neptunedata', endpoint_url='https://your-neptune-endpoint:port', config=Config(read_timeout=None, retries={'total_max_attempts': 1}) ) response = client.execute_open_cypher_query( openCypherQuery='CALL neptune.graph.pg_schema.stop()' ) print(response)
awscurl
awscurl -X POST https://your-neptune-endpoint:port/openCypher \ -H "Content-Type: application/x-www-form-urlencoded" \ --region us-east-1 --service neptune-db \ -d 'query=CALL neptune.graph.pg_schema.stop()'

Actions IAM requises : neptune-db:ReadDataViaQuery et neptune-db:WriteDataViaQuery

Comportement :

  • Arrête le calcul en cours. La progression est enregistrée afin de pouvoir reprendre là où elle s'était arrêtée lorsque vous appelez compute() encore une fois.

  • Un calcul arrêté fait pas reprend automatiquement au redémarrage du moteur. Vous devez appeler explicitement compute().

Réponse : Renvoie l'objet d'état indiquant l'état : "Stopped" avec le courant progressPercentage.

Utilisation de YIELD avec les résultats du schéma

Vous pouvez utiliser YIELD pour extraire les champs du schéma et les combiner avec d'autres requêtes. L'exemple suivant récupère toutes les étiquettes de nœuds et compte le nombre de nœuds pour chaque étiquette. Le collSort() fonction trie la liste par ordre alphabétique :

CALL neptune.graph.pg_schema() YIELD schema WITH schema.nodeLabels as nl UNWIND collSort(nl) as label MATCH (n) WHERE label in labels(n) RETURN label, COUNT(n) as count

Exemple de sortie :

{ "results": [{ "label": "airport", "count": 3503 }, { "label": "continent", "count": 7 }, { "label": "country", "count": 237 }, { "label": "version", "count": 1 }] }

Cycle de vie du calcul des schémas

Fonctionnement asynchrone

Le calcul du schéma est une opération asynchrone. Quand tu appelles neptune.graph.pg_schema.compute(), il revient immédiatement avec le statut actuel. Le calcul s'exécute en arrière-plan. Vous effectuez un sondage pour connaître les progrès et les résultats en appelant neptune.graph.pg_schema(), qui renvoie l'état actuel et progressPercentage.

States

Le calcul du schéma passe par les états suivants :

  • NotStarted — Aucun schéma n'a encore été calculé. pg_schema() renvoie un schéma vide.

  • InProgress — Un calcul de fond est en cours. pg_schema() renvoie des résultats partiels (union du dernier schéma complet et des découvertes issues du calcul en cours).

  • Completed — Le calcul s'est terminé avec succès. Le schéma complet est disponible.

  • Stopped — Le calcul a été arrêté par un appel explicite à stop(). Des résultats partiels sont disponibles. La progression est enregistrée afin que le calcul puisse reprendre là où il s'était arrêté lorsque vous appelez compute(). Un calcul arrêté ne comporte pas de errorMessage.

  • Paused — À partir de la version 1.5.0.0 du moteur Neptune, un redémarrage du moteur ou un basculement entraîne une transition InProgress calcul pour Paused plutôt que Stopped. Des résultats partiels sont disponibles et le calcul enregistre sa progression. Pour reprendre là où il s'est arrêté, appelez compute(). La reprise renvoie le calcul à InProgress et puis Completed.

  • Failed — Le calcul a rencontré une erreur. Le dernier schéma correctement calculé (le cas échéant) reste disponible. L'objet d'état comprend un errorMessage expliquant l'échec.

Comportement de persistance et de redémarrage

Le schéma calculé est conservé et survit aux redémarrages du moteur. Le comportement de redémarrage dépend de l'état au moment du redémarrage :

  • InProgress — Si le moteur redémarre ou tombe en panne pendant le calcul, celui-ci est interrompu. À partir de la version 1.5.0.0 du moteur Neptune, le calcul passe à Paused; dans les versions précédentes, il passe à Stopped. Appel compute() pour reprendre là où il s'était arrêté. Le calcul préserve la progression et se poursuit à partir de son dernier point de contrôle.

  • Paused — Le calcul fait pas reprendre automatiquement. Tu dois appeler compute() pour reprendre là où il s'était arrêté.

  • Stopped — Le calcul fait pas reprendre automatiquement. Tu dois appeler compute() pour reprendre là où il s'était arrêté.

  • Completed — Le schéma est chargé et disponible immédiatement.

Résultats partiels

Pendant qu'un calcul est en cours, pg_schema() renvoie des résultats partiels. Ceux-ci incluent tout schéma précédemment terminé fusionné avec les étiquettes, les propriétés et les triplets découverts jusqu'à présent dans le calcul en cours. Cela signifie que vous n'avez pas à attendre la fin d'un calcul complet pour récupérer des informations de schéma utiles.

Réplicas en lecture

Les instances de réplication en lecture peuvent lire le schéma à l'aide de CALL neptune.graph.pg_schema(). Neptune réplique le schéma à partir de l'instance d'écriture et le rend disponible sur les répliques presque immédiatement à mesure que des éléments de schéma sont découverts sur l'enregistreur.

Les répliques en lecture ne peuvent pas s'exécuter compute() ou stop(). Ces appels renvoient une erreur :

  • compute() – "Schema cannot be computed on read replica"

  • stop() – "Schema compute cannot be stopped on read replica"

Bonnes pratiques

  • Recalculer après des mutations — Le schéma ne se met pas à jour automatiquement en cas de modification des données. Recalculez le schéma après des chargements en masse ou des mutations de données importantes. Utilisez le lastComputedTimestamp champ pour déterminer si le schéma est obsolète par rapport aux modifications récentes apportées à votre graphique.

  • Simultanéité — La valeur de simultanéité par défaut (0) s'adapte automatiquement au matériel de votre instance. Pour la plupart des charges de travail, il s'agit du paramètre recommandé. Si le calcul en arrière-plan a un impact sur la charge de travail de vos requêtes, spécifiez une valeur inférieure (par exemple, 1 ou 2) pour réduire l'utilisation des ressources.

  • Arrêter et reprendre — Si le calcul en arrière-plan a un impact sur la charge de travail de vos requêtes, arrêtez-le avec stop() et reprenez plus tard pendant une période de faible trafic en appelant compute() encore une fois. Le calcul reprend là où il s'était arrêté.

  • La poignée redémarre avec élégance — Si le moteur redémarre ou tombe en panne alors qu'un calcul de schéma est en cours, le calcul est interrompu. À partir de la version 1.5.0.0 du moteur Neptune, il passe à Paused. Appel compute() pour reprendre là où il s'était arrêté. Les progrès sont préservés.

  • Grandes bases de données — Pour les bases de données comportant de grands volumes de stockage (plusieurs To), le calcul complet du schéma peut prendre plus de temps. Vous pouvez démarrer un calcul, le laisser s'exécuter jusqu'à une progression de 10 à 20 %, puis l'arrêter. Les résultats partiels collectés au cours de cette fenêtre fournissent un exemple de schéma utile avec de nombreux libellés, propriétés et triplets déjà découverts. Lisez le schéma partiel avec pg_schema() pendant que le calcul est en cours ou après l'arrêt. Reprenez plus tard lorsque votre charge de travail le permettra.

Limitations

  • Les suppressions nécessitent un recalcul — Les étiquettes, propriétés et triplets supprimés ne sont supprimés du schéma qu'après le prochain recalcul complet. D'ici là, les éléments supprimés peuvent toujours apparaître dans les résultats du schéma.

  • OpenCypher seulement — Vous pouvez appeler cette procédure uniquement via le point de terminaison de requête OpenCypher.

  • Impossible de calculer pendant le chargement groupé — Neptune rejette le calcul du schéma lorsqu'une opération de chargement groupé est active. Déclenchez le calcul une fois le chargement groupé terminé.

Exemple de sortie.

L'exemple suivant montre la sortie du schéma pour le jeu de données sur les routes aériennes :

awscurl -X POST https://your-neptune-endpoint:port/openCypher \ -H "Content-Type: application/x-www-form-urlencoded" \ --region us-east-1 --service neptune-db \ -d 'query=CALL neptune.graph.pg_schema()'
{ "results": [{ "schema": { "edgeLabelDetails": { "route": { "properties": { "dist": ["Int"] } }, "contains": { "properties": {} } }, "edgeLabels": ["route", "contains"], "status": { "concurrency": "16", "lastComputedTimestamp": "2026-06-04T23:58:17Z", "state": "Completed", "progressPercentage": "100" }, "nodeLabels": ["version", "continent", "airport", "country"], "labelTriples": [{ "~type": "route", "~from": "airport", "~to": "airport" }, { "~type": "contains", "~from": "country", "~to": "airport" }, { "~type": "contains", "~from": "continent", "~to": "airport" }], "nodeLabelDetails": { "continent": { "properties": { "type": ["String"], "code": ["String"], "desc": ["String"] } }, "airport": { "properties": { "type": ["String"], "city": ["String"], "icao": ["String"], "code": ["String"], "country": ["String"], "lat": ["Double"], "longest": ["Int"], "runways": ["Int"], "desc": ["String"], "lon": ["Double"], "region": ["String"], "elev": ["Int"] } }, "country": { "properties": { "type": ["String"], "code": ["String"], "desc": ["String"] } }, "version": { "properties": { "date": ["String"], "desc": ["String"], "author": ["String"], "type": ["String"], "code": ["String"] } } } } }] }