meta

The meta module provides a set of procedures for generating metadata about the database.

docs-source (opens in a new tab)

TraitValue
Module typealgorithm
ImplementationC++
Parallelismparallel

Procedures

stats_online(update_stats)

Retrieves the graph metadata in O(1) complexity. Requires setting up the following trigger:

CREATE TRIGGER meta_trigger BEFORE COMMIT EXECUTE CALL meta.update(createdObjects, deletedObjects, removedVertexProperties, removedEdgeProperties, setVertexLabels, removedVertexLabels);

This procedure tracks the data created/deleted/modified after the trigger was added. If you want to return the metadata about the whole graph you need to run the stats_online procedure with the update_stats flag set to true once. That flag will cause the procedure to traverse the whole graph to update the metadata. After that you can always run with the update_stats flag set to false and the procedure will return the metadata in O(1) complexity.

Input:

  • update_stats: bool (default=false) ➡ if true traverses the whole graph to update the metadata otherwise returns the stored metadata.

Output:

  • labelCount: int ➡ number of unique labels in nodes.
  • relationshipTypeCount: int ➡ number of unique relationship types (labels).
  • nodeCount: int ➡ number of nodes in the graph.
  • relationshipCount: int ➡ number of relationships in the graph.
  • labels: Map[string: int] ➡ map with the following (key, value) pairs:
    • label : number_of_occurrences
  • relationshipTypes: Map[string: int] ➡ map with the following (key, value) pairs:
    • (:label)-[:relationship_type]->() : number_of_occurrences
    • ()-[:relationship_type]->(:label) : number_of_occurrences
    • ()-[:relationship_type]->() : number_of_occurrences
  • relationshipTypesCount: Map[string: int] ➡ map with the following (key, value) pairs:
    • relationship_type : number_of_occurrences
  • stats ➡ map which contains all of the above.

Usage:

Running stats on the following graph:

MERGE (a:Node {id: 0}) MERGE (b:Node {id: 1}) CREATE (a)-[:Relation1]->(b);
MERGE (a:Node {id: 1}) MERGE (b:Node {id: 2}) CREATE (a)-[:Relation1]->(b);
MERGE (a:Node {id: 2}) MERGE (b:Node {id: 0}) CREATE (a)-[:Relation1]->(b);
MERGE (a:Node {id: 3}) MERGE (b:Node {id: 3}) CREATE (a)-[:Relation2]->(b);
MERGE (a:Node {id: 3}) MERGE (b:Node {id: 4}) CREATE (a)-[:Relation2]->(b);
MERGE (a:Node {id: 3}) MERGE (b:Node {id: 5}) CREATE (a)-[:Relation2]->(b);
CALL meta.stats_online() YIELD stats;
+-------------------------------------------------------+
|     stats                                             |
+-------------------------------------------------------+
|                                                       |
|{                                                      |
|   "labelCount": 1,                                    |
|   "labels": {                                         |
|      "Node": 6                                        |
|   },                                                  |
|   "nodeCount": 6,                                     |
|   "propertyKeyCount": 1,                              |
|   "relationshipCount": 6,                             |
|   "relationshipTypeCount": 2,                         |
|   "relationshipTypes": {                              |
|      "()-[:Relation1]->()": 3,                        |
|      "()-[:Relation1]->(:Node)": 3,                   |
|      "()-[:Relation2]->()": 3,                        |
|      "()-[:Relation2]->(:Node)": 3,                   |
|      "(:Node)-[:Relation1]->()": 3,                   |
|      "(:Node)-[:Relation2]->()": 3                    |
|   },                                                  |
|   "relationshipTypesCount": {                         |
|      "Relation1": 3,                                  |
|      "Relation2": 3                                   |
|   }                                                   |
|}                                                      |
|                                                       |
+-------------------------------------------------------+

stats_offline()

Retrieves the graph metadata by traversing the whole graph. stats_online should be preferred because of the better complexity unless you don't want to use triggers.

Output:

  • labelCount: int ➡ number of unique labels in nodes.
  • relationshipTypeCount: int ➡ number of unique relationship types (labels).
  • nodeCount: int ➡ number of nodes in the graph.
  • relationshipCount: int ➡ number of relationships in the graph.
  • labels: Map[string: int] ➡ map with the following (key, value) pairs:
    • label : number_of_occurrences
  • relationshipTypes: Map[string: int] ➡ map with the following (key, value) pairs:
    • (:label)-[:relationship_type]->() : number_of_occurrences
    • ()-[:relationship_type]->(:label) : number_of_occurrences
    • ()-[:relationship_type]->() : number_of_occurrences
  • relationshipTypesCount: Map[string: int] ➡ map with the following (key, value) pairs:
    • relationship_type : number_of_occurrences
  • stats ➡ map which contains all of the above.

Usage:

Running stats on the following graph:

MERGE (a:Node {id: 0}) MERGE (b:Node {id: 1}) CREATE (a)-[:Relation1]->(b);
MERGE (a:Node {id: 1}) MERGE (b:Node {id: 2}) CREATE (a)-[:Relation1]->(b);
MERGE (a:Node {id: 2}) MERGE (b:Node {id: 0}) CREATE (a)-[:Relation1]->(b);
MERGE (a:Node {id: 3}) MERGE (b:Node {id: 3}) CREATE (a)-[:Relation2]->(b);
MERGE (a:Node {id: 3}) MERGE (b:Node {id: 4}) CREATE (a)-[:Relation2]->(b);
MERGE (a:Node {id: 3}) MERGE (b:Node {id: 5}) CREATE (a)-[:Relation2]->(b);
CALL meta.stats_offline() YIELD stats;
+-------------------------------------------------------+
|     stats                                             |
+-------------------------------------------------------+
|                                                       |
|{                                                      |
|   "labelCount": 1,                                    |
|   "labels": {                                         |
|      "Node": 6                                        |
|   },                                                  |
|   "nodeCount": 6,                                     |
|   "propertyKeyCount": 1,                              |
|   "relationshipCount": 6,                             |
|   "relationshipTypeCount": 2,                         |
|   "relationshipTypes": {                              |
|      "()-[:Relation1]->()": 3,                        |
|      "()-[:Relation1]->(:Node)": 3,                   |
|      "()-[:Relation2]->()": 3,                        |
|      "()-[:Relation2]->(:Node)": 3,                   |
|      "(:Node)-[:Relation1]->()": 3,                   |
|      "(:Node)-[:Relation2]->()": 3                    |
|   },                                                  |
|   "relationshipTypesCount": {                         |
|      "Relation1": 3,                                  |
|      "Relation2": 3                                   |
|   }                                                   |
|}                                                      |
|                                                       |
+-------------------------------------------------------+