Graph Management

    An edge definition is always a directed relation of a graph. Each graph can have arbitrary many relations defined within the edge definitions array.

    Create a list of edge definitions to construct a graph.

    The list of edge definitions of a graph can be managed by the graph module itself.This function is the entry point for the management and will return the correct list.

    Parameters

    • relationX (optional) An object representing a definition of one relation in the graphExamples

    Show execution results

    1. {
    2. "collection" : "lives_in",
    3. "from" : [
    4. "user"
    5. ],
    6. "to" : [
    7. "city"
    8. ]
    9. }
    10. {
    11. "collection" : "knows",
    12. "from" : [
    13. "user"
    14. ],
    15. "to" : [
    16. "user"
    17. ]
    18. }
    19. [
    20. {
    21. "collection" : "lives_in",
    22. "from" : [
    23. "user"
    24. ],
    25. "to" : [
    26. "city"
    27. ]
    28. },
    29. {
    30. "collection" : "knows",
    31. "from" : [
    32. "user"
    33. ],
    34. "to" : [
    35. "user"
    36. ]
    37. }
    38. ]

    Hide execution results

    Extend the list

    Extend the list of edge definitions to construct a graph.

    graph_module._extendEdgeDefinitions(edgeDefinitions, relation1, relation2, …, relationN)

    In order to add more edge definitions to the graph before creatingthis function can be used to add more definitions to the initial list.

    Parameters

    • edgeDefinitions (required) A list of relation definition objects.
    • relationX (required) An object representing a definition of one relation in the graphExamples
    1. arangosh> var graph_module = require("@arangodb/general-graph");
    2. arangosh> directed_relation = graph_module._relation("lives_in", "user", "city");
    3. arangosh> undirected_relation = graph_module._relation("knows", "user", "user");
    4. arangosh> edgedefinitions = graph_module._edgeDefinitions(directed_relation);
    5. arangosh> edgedefinitions = graph_module._extendEdgeDefinitions(undirected_relation);

    Show execution results

    1. {
    2. "collection" : "lives_in",
    3. "from" : [
    4. "user"
    5. ],
    6. "to" : [
    7. "city"
    8. ]
    9. }
    10. {
    11. "collection" : "knows",
    12. "from" : [
    13. "user"
    14. ],
    15. "to" : [
    16. "user"
    17. ]
    18. }
    19. [
    20. {
    21. "collection" : "lives_in",
    22. "from" : [
    23. "user"
    24. ],
    25. "to" : [
    26. "city"
    27. ]
    28. }
    29. ]

    Hide execution results

    Relation

    Define a directed relation.

    graph_module._relation(relationName, fromVertexCollections, toVertexCollections)

    The relationName defines the name of this relation and references to the underlying edge collection.The fromVertexCollections is an Array of document collections holding the start vertices.The toVertexCollections is an Array of document collections holding the target vertices.Relations are only allowed in the direction from any collection in fromVertexCollections_to any collection in _toVertexCollections.

    Parameters

    • relationName (required) The name of the edge collection where the edges should be stored.Will be created if it does not yet exist.
    • fromVertexCollections (required) One or a list of collection names. Source vertices for the edgeshave to be stored in these collections. Collections will be created if they do not exist.
    • toVertexCollections (required) One or a list of collection names. Target vertices for the edgeshave to be stored in these collections. Collections will be created if they do not exist.Examples
    1. arangosh> var graph_module = require("@arangodb/general-graph");
    2. arangosh> graph_module._relation("has_bought", ["Customer", "Company"], ["Groceries", "Electronics"]);

    Show execution results

    1. {
    2. "collection" : "has_bought",
    3. "from" : [
    4. "Customer",
    5. "Company"
    6. ],
    7. "to" : [
    8. "Groceries",
    9. "Electronics"
    10. ]
    11. }

    Hide execution results

    1. arangosh> var graph_module = require("@arangodb/general-graph");
    2. arangosh> graph_module._relation("has_bought", "Customer", "Product");

    Show execution results

    1. {
    2. "collection" : "has_bought",
    3. "from" : [
    4. "Customer"
    5. ],
    6. "to" : [
    7. "Product"
    8. ]

    Hide execution results

    Create a graph

    After having introduced edge definitions a graph can be created.

    Create a graph

    graph_module._create(graphName, edgeDefinitions, orphanCollections)

    The creation of a graph requires the name of the graph and a definition of its edges.

    For every type of edge definition a convenience method exists that can be used to create a graph.Optionally a list of vertex collections can be added, which are not used in any edge definition.These collections are referred to as orphan collections within this chapter.All collections used within the creation process are created if they do not exist.

    Parameters

    • graphName (required) Unique identifier of the graph
    • edgeDefinitions (optional) List of relation definition objects
    • orphanCollections (optional) List of additional vertex collection namesExamples

    Create an empty graph, edge definitions can be added at runtime:

    1. arangosh> var graph_module = require("@arangodb/general-graph");
    2. arangosh> graph = graph_module._create("myGraph");

    Show execution results

    1. {[Graph]
    2. }

    Hide execution results

    Create a graph using an edge collection edges and a single vertex collection vertices

    1. arangosh> var graph_module = require("@arangodb/general-graph");
    2. arangosh> var edgeDefinitions = [ { collection: "edges", "from": [ "vertices" ], "to" : [ "vertices" ] } ];
    3. arangosh> graph = graph_module._create("myGraph", edgeDefinitions);

    Show execution results

    1. {[Graph]
    2. "edges" : [ArangoCollection 16669, "edges" (type edge, status loaded)],
    3. "vertices" : [ArangoCollection 16664, "vertices" (type document, status loaded)]
    4. }

    Hide execution results

    Create a graph with edge definitions and orphan collections:

    1. arangosh> var graph_module = require("@arangodb/general-graph");
    2. arangosh> graph = graph_module._create("myGraph",
    3. ........> [graph_module._relation("myRelation", ["male", "female"], ["male", "female"])], ["sessions"]);

    Show execution results

    1. {[Graph]
    2. "myRelation" : [ArangoCollection 16525, "myRelation" (type edge, status loaded)],
    3. "female" : [ArangoCollection 16519, "female" (type document, status loaded)],
    4. "male" : [ArangoCollection 16515, "male" (type document, status loaded)],
    5. "sessions" : [ArangoCollection 16529, "sessions" (type document, status loaded)]
    6. }

    Hide execution results

    Complete Example to create a graph

    Example Call:

    1. arangosh> var graph_module = require("@arangodb/general-graph");
    2. arangosh> var edgeDefinitions = graph_module._edgeDefinitions();
    3. arangosh> graph_module._extendEdgeDefinitions(edgeDefinitions, graph_module._relation("friend_of", "Customer", "Customer"));
    4. arangosh> graph_module._extendEdgeDefinitions(
    5. ........> edgeDefinitions, graph_module._relation(
    6. ........> "has_bought", ["Customer", "Company"], ["Groceries", "Electronics"]));
    7. arangosh> graph_module._create("myStore", edgeDefinitions);

    Show execution results

    1. {[Graph]
    2. "friend_of" : [ArangoCollection 22583, "friend_of" (type edge, status loaded)],
    3. "Customer" : [ArangoCollection 22578, "Customer" (type document, status loaded)],
    4. "has_bought" : [ArangoCollection 22600, "has_bought" (type edge, status loaded)],
    5. "Company" : [ArangoCollection 22588, "Company" (type document, status loaded)],
    6. "Electronics" : [ArangoCollection 22596, "Electronics" (type document, status loaded)],
    7. "Groceries" : [ArangoCollection 22592, "Groceries" (type document, status loaded)]
    8. }

    Hide execution results

    alternative call:

    1. arangosh> var graph_module = require("@arangodb/general-graph");
    2. arangosh> var edgeDefinitions = graph_module._edgeDefinitions(
    3. ........> graph_module._relation("friend_of", ["Customer"], ["Customer"]), graph_module._relation(
    4. ........> "has_bought", ["Customer", "Company"], ["Groceries", "Electronics"]));
    5. arangosh> graph_module._create("myStore", edgeDefinitions);

    Show execution results

    1. {[Graph]
    2. "friend_of" : [ArangoCollection 22625, "friend_of" (type edge, status loaded)],
    3. "Customer" : [ArangoCollection 22620, "Customer" (type document, status loaded)],
    4. "has_bought" : [ArangoCollection 22642, "has_bought" (type edge, status loaded)],
    5. "Company" : [ArangoCollection 22629, "Company" (type document, status loaded)],
    6. "Electronics" : [ArangoCollection 22634, "Electronics" (type document, status loaded)],
    7. "Groceries" : [ArangoCollection 22638, "Groceries" (type document, status loaded)]
    8. }

    Hide execution results

    List all graphs.

    graph_module._list()

    Lists all graph names stored in this database.

    Examples

    1. arangosh> var graph_module = require("@arangodb/general-graph");
    2. arangosh> graph_module._list();

    Show execution results

    Hide execution results

    Load a graph

    Get a graph

    A graph can be retrieved by its name.

    Parameters

    • graphName (required) Unique identifier of the graphExamples

    Get a graph:

    1. arangosh> var graph_module = require("@arangodb/general-graph");
    2. arangosh> graph = graph_module._graph("social");

    Show execution results

    1. {[Graph]
    2. "relation" : [ArangoCollection 17298, "relation" (type edge, status loaded)],
    3. "female" : [ArangoCollection 17292, "female" (type document, status loaded)],
    4. "male" : [ArangoCollection 17295, "male" (type document, status loaded)]
    5. }

    Hide execution results

    Remove a graph

    A graph can be dropped by its name.This can drop all collections contained in the graph as long as they are not used within other graphs.To drop the collections only belonging to this graph, the optional parameter drop-collections has to be set to true.

    Parameters

    • graphName (required) Unique identifier of the graph
    • dropCollections (optional) Define if collections should be dropped (default: false)Examples

    Drop a graph and keep collections:

    1. arangosh> var graph_module = require("@arangodb/general-graph");
    2. arangosh> graph_module._drop("social");
    3. arangosh> db._collection("female");
    4. arangosh> db._collection("male");
    5. arangosh> db._collection("relation");

    Show execution results

    1. true
    2. [ArangoCollection 16756, "female" (type document, status loaded)]
    3. [ArangoCollection 16759, "male" (type document, status loaded)]
    4. [ArangoCollection 16762, "relation" (type edge, status loaded)]

    Hide execution results

    1. arangosh> var graph_module = require("@arangodb/general-graph");
    2. arangosh> graph_module._drop("social", true);
    3. arangosh> db._collection("female");
    4. arangosh> db._collection("male");
    5. arangosh> db._collection("relation");

    Show execution results

    1. true
    2. null
    3. null
    4. null

    Hide execution results

    Modify a graph definition at runtime

    After you have created an graph its definition is not immutable.You can still add, delete or modify edge definitions and vertex collections.

    Extend the edge definitions

    Add another edge definition to the graph

    graph._extendEdgeDefinitions(edgeDefinition)

    Extends the edge definitions of a graph. If an orphan collection is used in thisedge definition, it will be removed from the orphanage. If the edge collection ofthe edge definition to add is already used in the graph or used in a differentgraph with different from and/or to collections an error is thrown.

    Parameters

    • edgeDefinition (required) The relation definition to extend the graphExamples
    1. arangosh> var graph_module = require("@arangodb/general-graph")
    2. arangosh> var ed1 = graph_module._relation("myEC1", ["myVC1"], ["myVC2"]);
    3. arangosh> var ed2 = graph_module._relation("myEC2", ["myVC1"], ["myVC3"]);
    4. arangosh> var graph = graph_module._create("myGraph", [ed1]);
    5. arangosh> graph._extendEdgeDefinitions(ed2);

    Show execution results

    1.  

    Hide execution results

    Modify an relation definition

    graph_module._editEdgeDefinition(edgeDefinition)

    Edits one relation definition of a graph. The edge definition used as argument willreplace the existing edge definition of the graph which has the same collection.Vertex Collections of the replaced edge definition that are not used in the newdefinition will transform to an orphan. Orphans that are used in this new edgedefinition will be deleted from the list of orphans. Other graphs with the same edgedefinition will be modified, too.

    Parameters

    • edgeDefinition (required) The edge definition to replace the existing edgedefinition with the same attribute collection.Examples
    1. arangosh> var graph_module = require("@arangodb/general-graph")
    2. arangosh> var original = graph_module._relation("myEC1", ["myVC1"], ["myVC2"]);
    3. arangosh> var modified = graph_module._relation("myEC1", ["myVC2"], ["myVC3"]);
    4. arangosh> var graph = graph_module._create("myGraph", [original]);
    5. arangosh> graph._editEdgeDefinitions(modified);

    Show execution results

    1.  

    Hide execution results

    Delete an edge definition

    Delete one relation definition

    graph_module._deleteEdgeDefinition(edgeCollectionName, dropCollection)

    Deletes a relation definition defined by the edge collection of a graph. If thecollections defined in the edge definition (collection, from, to) are not usedin another edge definition of the graph, they will be moved to the orphanage.

    Parameters

    • edgeCollectionName (required) Name of edge collection in the relation definition.
    • dropCollection (optional) Define if the edge collection should be dropped. Default false.Examples

    Remove an edge definition but keep the edge collection:

    1. arangosh> var graph_module = require("@arangodb/general-graph")
    2. arangosh> var ed1 = graph_module._relation("myEC1", ["myVC1"], ["myVC2"]);
    3. arangosh> var ed2 = graph_module._relation("myEC2", ["myVC1"], ["myVC3"]);
    4. arangosh> var graph = graph_module._create("myGraph", [ed1, ed2]);
    5. arangosh> graph._deleteEdgeDefinition("myEC1");
    6. arangosh> db._collection("myEC1");

    Show execution results

    1. [ArangoCollection 22285, "myEC1" (type edge, status loaded)]

    Hide execution results

    Remove an edge definition and drop the edge collection:

    1. arangosh> var graph_module = require("@arangodb/general-graph")
    2. arangosh> var ed1 = graph_module._relation("myEC1", ["myVC1"], ["myVC2"]);
    3. arangosh> var ed2 = graph_module._relation("myEC2", ["myVC1"], ["myVC3"]);
    4. arangosh> var graph = graph_module._create("myGraph", [ed1, ed2]);
    5. arangosh> graph._deleteEdgeDefinition("myEC1", true);
    6. arangosh> db._collection("myEC1");

    Show execution results

    1. null

    Hide execution results

    Extend vertex Collections

    Each graph can have an arbitrary amount of vertex collections, which are not part of any edge definition of the graph.These collections are called orphan collections.If the graph is extended with an edge definition using one of the orphans,it will be removed from the set of orphan collection automatically.

    Add a vertex collection

    Add a vertex collection to the graph

    graph._addVertexCollection(vertexCollectionName, createCollection)

    Adds a vertex collection to the set of orphan collections of the graph. If thecollection does not exist, it will be created. If it is already used by any edgedefinition of the graph, an error will be thrown.

    Parameters

    • vertexCollectionName (required) Name of vertex collection.
    • createCollection (optional) If true the collection will be created if it does not exist. Default: true.Examples
    1. arangosh> var graph_module = require("@arangodb/general-graph");
    2. arangosh> var ed1 = graph_module._relation("myEC1", ["myVC1"], ["myVC2"]);
    3. arangosh> var graph = graph_module._create("myGraph", [ed1]);
    4. arangosh> graph._addVertexCollection("myVC3", true);

    Show execution results

    1.  

    Hide execution results

    Get the orphaned collections

    Get all orphan collections

    graph._orphanCollections()

    Returns all vertex collections of the graph that are not used in any edge definition.

    Examples

    1. arangosh> var graph_module = require("@arangodb/general-graph")
    2. arangosh> var ed1 = graph_module._relation("myEC1", ["myVC1"], ["myVC2"]);
    3. arangosh> var graph = graph_module._create("myGraph", [ed1]);
    4. arangosh> graph._addVertexCollection("myVC3", true);
    5. arangosh> graph._orphanCollections();

    Show execution results

    1. [
    2. "myVC3"
    3. ]

    Remove a vertex collection

    Remove a vertex collection from the graph

    graph._removeVertexCollection(vertexCollectionName, dropCollection)

    Removes a vertex collection from the graph.Only collections not used in any relation definition can be removed.Optionally the collection can be deleted, if it is not used in any other graph.

    Parameters

    • vertexCollectionName (required) Name of vertex collection.
    • dropCollection (optional) If true the collection will be dropped if it isnot used in any other graph. Default: false.Examples

    Show execution results

    1. "myVC3",
    2. "myVC4"
    3. ]
    4. [
    5. "myVC4"
    6. ]

    Hide execution results

    Save a vertex

    Create a new vertex in vertexCollectionName

    graph.vertexCollectionName.save(data)

    Parameters

    • data (required) JSON data of vertex.Examples
    1. arangosh> var examples = require("@arangodb/graph-examples/example-graph.js");
    2. arangosh> var graph = examples.loadGraph("social");
    3. arangosh> graph.male.save({name: "Floyd", _key: "floyd"});

    Show execution results

    1. {
    2. "_id" : "male/floyd",
    3. "_key" : "floyd",
    4. "_rev" : "_ZHpY2Ai--B"
    5. }

    Hide execution results

    Replace a vertex

    Replaces the data of a vertex in collection vertexCollectionName

    Parameters

    • vertexId (required) _id attribute of the vertex
    • data (required) JSON data of vertex.
    • options (optional) See collection documentationExamples
    1. arangosh> var examples = require("@arangodb/graph-examples/example-graph.js");
    2. arangosh> var graph = examples.loadGraph("social");
    3. arangosh> graph.male.save({neym: "Jon", _key: "john"});
    4. arangosh> graph.male.replace("male/john", {name: "John"});

    Show execution results

    1. {
    2. "_id" : "male/john",
    3. "_key" : "john",
    4. "_rev" : "_ZHpY17W--_"
    5. }
    6. {
    7. "_id" : "male/john",
    8. "_key" : "john",
    9. "_rev" : "_ZHpY17W--B",
    10. "_oldRev" : "_ZHpY17W--_"
    11. }

    Hide execution results

    Updates the data of a vertex in collection vertexCollectionName

    graph.vertexCollectionName.update(vertexId, data, options)

    Parameters

    • vertexId (required) _id attribute of the vertex
    • data (required) JSON data of vertex.
    • options (optional) See Examples
    1. arangosh> var examples = require("@arangodb/graph-examples/example-graph.js");
    2. arangosh> var graph = examples.loadGraph("social");
    3. arangosh> graph.female.save({name: "Lynda", _key: "linda"});
    4. arangosh> graph.female.update("female/linda", {name: "Linda", _key: "linda"});

    Show execution results

    1. {
    2. "_id" : "female/linda",
    3. "_key" : "linda",
    4. "_rev" : "_ZHpY2Fm--B"
    5. }
    6. {
    7. "_id" : "female/linda",
    8. "_key" : "linda",
    9. "_rev" : "_ZHpY2Fq--_",
    10. "_oldRev" : "_ZHpY2Fm--B"
    11. }

    Hide execution results

    Remove a vertex

    Removes a vertex in collection vertexCollectionName

    graph.vertexCollectionName.remove(vertexId, options)

    Additionally removes all ingoing and outgoing edges of the vertex recursively(see ).

    Parameters

    1. arangosh> var examples = require("@arangodb/graph-examples/example-graph.js");
    2. arangosh> var graph = examples.loadGraph("social");
    3. arangosh> graph.male.save({name: "Kermit", _key: "kermit"});
    4. arangosh> db._exists("male/kermit")
    5. arangosh> graph.male.remove("male/kermit")
    6. arangosh> db._exists("male/kermit")

    Show execution results

    1. {
    2. "_id" : "male/kermit",
    3. "_key" : "kermit",
    4. "_rev" : "_ZHpY11q--_"
    5. }
    6. true
    7. true
    8. false

    Hide execution results

    Manipulating Edges

    Save a new edge

    Creates an edge from vertex from to vertex to in collection edgeCollectionName

    graph.edgeCollectionName.save(from, to, data, options)

    Parameters

    • from (required) _id attribute of the source vertex
    • to (required) _id attribute of the target vertex
    • data (required) JSON data of the edge
    • options (optional) See Examples
    1. arangosh> var examples = require("@arangodb/graph-examples/example-graph.js");
    2. arangosh> var graph = examples.loadGraph("social");
    3. arangosh> graph.relation.save("male/bob", "female/alice", {type: "married", _key: "bobAndAlice"});

    Show execution results

    1. {
    2. "_id" : "relation/bobAndAlice",
    3. "_key" : "bobAndAlice",
    4. "_rev" : "_ZHpYt8e--F"
    5. }

    Hide execution results

    If the collections of from and to are not defined in an edge definition of the graph,the edge will not be stored.

    1. arangosh> var examples = require("@arangodb/graph-examples/example-graph.js");
    2. arangosh> var graph = examples.loadGraph("social");
    3. arangosh> graph.relation.save(
    4. ........> "relation/aliceAndBob",
    5. ........> "female/alice",
    6. ........> {type: "married", _key: "bobAndAlice"});

    Show execution results

    1. [ArangoError 1906: invalid edge between relation/aliceAndBob and female/alice. Doesn't conform to any edge definition]

    Hide execution results

    Replace an edge

    Replaces the data of an edge in collection edgeCollectionName. Note that _from and _to are mandatory.

    graph.edgeCollectionName.replace(edgeId, data, options)

    Parameters

    • edgeId (required) _id attribute of the edge
    • data (required) JSON data of the edge
    • options (optional) See Examples
    1. arangosh> var examples = require("@arangodb/graph-examples/example-graph.js");
    2. arangosh> var graph = examples.loadGraph("social");
    3. arangosh> graph.relation.save("female/alice", "female/diana", {typo: "nose", _key: "aliceAndDiana"});
    4. arangosh> graph.relation.replace("relation/aliceAndDiana", {type: "knows", _from: "female/alice", _to: "female/diana"});

    Show execution results

    1. {
    2. "_id" : "relation/aliceAndDiana",
    3. "_key" : "aliceAndDiana",
    4. "_rev" : "_ZHpYt3i--D"
    5. }
    6. {
    7. "_id" : "relation/aliceAndDiana",
    8. "_key" : "aliceAndDiana",
    9. "_rev" : "_ZHpYt3m--_",
    10. "_oldRev" : "_ZHpYt3i--D"
    11. }

    Hide execution results

    Update an edge

    Updates the data of an edge in collection edgeCollectionName

    graph.edgeCollectionName.update(edgeId, data, options)

    Parameters

    • edgeId (required) _id attribute of the edge
    • data (required) JSON data of the edge
    • options (optional) See Examples
    1. arangosh> var examples = require("@arangodb/graph-examples/example-graph.js");
    2. arangosh> var graph = examples.loadGraph("social");
    3. arangosh> graph.relation.save("female/alice", "female/diana", {type: "knows", _key: "aliceAndDiana"});
    4. arangosh> graph.relation.update("relation/aliceAndDiana", {type: "quarreled", _key: "aliceAndDiana"});

    Show execution results

    1. {
    2. "_id" : "relation/aliceAndDiana",
    3. "_key" : "aliceAndDiana",
    4. "_rev" : "_ZHpYuHK--_"
    5. }
    6. {
    7. "_id" : "relation/aliceAndDiana",
    8. "_key" : "aliceAndDiana",
    9. "_rev" : "_ZHpYuHK--B",
    10. "_oldRev" : "_ZHpYuHK--_"
    11. }

    Hide execution results

    Removes an edge in collection edgeCollectionName

    If this edge is used as a vertex by another edge, the other edge will be removed (recursively).

    Parameters

    1. arangosh> var examples = require("@arangodb/graph-examples/example-graph.js");
    2. arangosh> var graph = examples.loadGraph("social");
    3. arangosh> graph.relation.save("female/alice", "female/diana", {_key: "aliceAndDiana"});
    4. arangosh> db._exists("relation/aliceAndDiana")
    5. arangosh> db._exists("relation/aliceAndDiana")

    Hide execution results