Ask a Question

JSON Mutation Format

Dgraph supports Mutations in JSON or RDF format. When using JSON format Dgraph creates nodes and relationships from the JSON structure and assigns UIDs to nodes.

Specifying node UIDs

For example, if you run this mutation:

 {
   "set": [
     {
      "name": "diggy",
      "dgraph.type": "Mascot"
     }
   ]
 }  
Copy

You will see that Dgraph responds with

{
  "data": {
    "code": "Success",
    "message": "Done",
    "queries": null,
    "uids": {
      "dg.3162278161.22055": "0xfffd8d72745f0650"
    }
  }Copy

Meaning that Dgraph has created one node from the JSON. It has used the identifier dg.3162278161.22055 during the transaction. And the final UID value for this node is 0xfffd8d72745f0650.

You can control the identifier name by specifying a uid field in your JSON data and using the notation: "uid" : "_:<your-identifier>"

In this mutation, there are two JSON objects and because they are referring to the same identifier, Dgraph creates only one node:

   {
   "set": [
     {
      "uid": "_:diggy",
      "name": "diggy",
      "dgraph.type": "Mascot"
     },
     {
      "uid": "_:diggy",
      "specie": "badger"
     }
   ]
 }  
Copy

When you run this mutation, you can see that Dgraph returns the UID of the node that was created with the diggy identifier:

{
  "data": {
    "code": "Success",
    "message": "Done",
    "queries": null,
    "uids": {
      "diggy": "0xfffd8d72745f0691"
    }Copy

Note that the specie field is added to the node already created with name and dgraph.type information.

Referencing existing nodes

You can use the "uid" field to reference an existing node. To do so, you must specify the UID value of the node.

For example:

   {
   "set": [
     {
      "uid": "0xfffd8d72745f0650",
      "specie": "badger"
     }
   ]
 }  
Copy

Adds the specie information to the node that was created earlier.

Language support

To set a string value for a specific lnguage, append the language tag to the field name. In case, specie predicate has the @lang directive, the JSON mutation

   {
   "set": [
     {
      "uid": "_:diggy",
      "name": "diggy",
      "dgraph.type": "Mascot",
      "specie@en" : "badger",
      "specie@fr" : "blaireau"
     }
   ]
 }  
Copy

Dgraph sets the specie string predicate in English and in French.

Geolocation support

Geo-location data must be specified using keys type and coordinates in the JSON document. The supported types are Point, Polygon, or MultiPolygon .

 {
   "set": [
     {
      "name": "diggy",
      "dgraph.type": "Mascot",
      "home" : {
          "type": "Point",
          "coordinates": [-122.475537, 37.769229 ]
       }
     }
   ]
 }    
Copy

Relationships

Relationships are simply created from the nested structure of JSON.

For example:

 {
   "set": [
     {
      "uid": "_:diggy",
      "name": "diggy",
      "dgraph.type": "Mascot",
      "food" : [
        {
          "uid":"_:f1",
          "name": "earthworms"
        },
        {
          "uid":"_:f2",
          "name": "apples"
        }]
     }
   ]
 }

Copy

This result in the creation of three nodes and the food predicate as a relationship.

{
  "data": {
    "code": "Success",
    "message": "Done",
    "queries": null,
    "uids": {
      "diggy": "0xfffd8d72745f06d7",
      "f1": "0xfffd8d72745f06d8",
      "f2": "0xfffd8d72745f06d9"
    }
    ...Copy

You can use references to existing nodes at any level of your nested JSON.

Deleting literal values

To delete node predicates, specify the UID of the node you are changing and set
the predicates to delete to the JSON value null.

For example, to remove the predicate name from node 0xfffd8d72745f0691 :

{
   "delete": [
     {
      "uid": "0xfffd8d72745f0691",
      "name": null
     }
   ]
}
Copy

Deleting relationship

A relationship can be defined with a cardinality of 1 or many (list). Setting a relationship to null removes all the relationships.

{
  "uid": "0xfffd8d72745f06d7",
  "food": null
}
Copy

To delete a single relationship in a list, you must specify the target node of the relationship.

{
   "delete": [
      {
      "uid": "0xfffd8d72745f06d7",
      "food": {
          "uid": "0xfffd8d72745f06d9"
        }
      }
   ]
}

Copy

deletes only one food relationship.

To delete all predicates of a given node:

  • make sure the node has a dgraph.type predicate
  • the type is defined in the Dgraph types schema
  • run a delete mutation specifying only the uid field
{
   "delete": [
      {
        "uid": "0x123"
      }
   ]
}
Copy

Handling arrays

To create a predicate as a list of string:

{
   "set": [
    {
      "testList": [
        "Grape",
        "Apple",
        "Strawberry",
        "Banana",
        "watermelon"
      ]
    }
   ]
}
Copy

For example, if 0x06 is the UID of the node created.

To remove one value from the list:

{
  "delete": {
    "uid": "0x6", #UID of the list.
    "testList": "Apple"
  }
}
Copy

To remove multiple multiple values:

{
  "delete": {
    "uid": "0x6",
    "testList": [
          "Strawberry",
          "Banana",
          "watermelon"
        ]
  }
}
Copy

To add a value:

{
   "uid": "0x6", #UID of the list.
   "testList": "Pineapple"
}
Copy

Adding Facets

Facets can be created by using the | character to separate the predicate and facet key in a JSON object field name. This is the same encoding schema used to show facets in query results. E.g.

{
  "name": "Carol",
  "name|initial": "C",
  "dgraph.type": "Person",
  "friend": {
    "name": "Daryl",
    "friend|close": "yes",
    "dgraph.type": "Person"
  }
}
Copy

Facets do not contain type information but Dgraph will try to guess a type from the input. If the value of a facet can be parsed to a number, it will be converted to either a float or an int. If it can be parsed as a Boolean, it will be stored as a Boolean. If the value is a string, it will be stored as a datetime if the string matches one of the time formats that Dgraph recognizes (YYYY, MM-YYYY, DD-MM-YYYY, RFC339, etc.) and as a double-quoted string otherwise. If you do not want to risk the chance of your facet data being misinterpreted as a time value, it is best to store numeric data as either an int or a float.

Deleting Facets

To delete a Facet, overwrite it. When you run a mutation for the same entity without a Facet, the existing Facet is deleted automatically.

Facets in List

Schema:

<name>: string @index(exact).
<nickname>: [string] .
Copy

To create a List-type predicate you need to specify all value in a single list. Facets for all predicate values should be specified together. It is done in map format with index of predicate values inside list being map key and their respective facets value as map values. Predicate values which does not have facets values will be missing from facets map. E.g.

{
  "set": [
    {
      "uid": "_:Julian",
      "name": "Julian",
      "nickname": ["Jay-Jay", "Jules", "JB"],
      "nickname|kind": {
        "0": "first",
        "1": "official",
        "2": "CS-GO"
      }
    }
  ]
}
Copy

Above you see that we have three values ​​to enter the list with their respective facets. You can run this query to check the list with facets:

{
   q(func: eq(name,"Julian")) {
    uid
    nickname @facets
   }
}
Copy

Later, if you want to add more values ​​with facets, just do the same procedure, but this time instead of using Blank-node you must use the actual node’s UID.

{
  "set": [
    {
      "uid": "0x3",
      "nickname|kind": "Internet",
      "nickname": "@JJ"
    }
  ]
}
Copy

And the final result is:

{
  "data": {
    "q": [
      {
        "uid": "0x3",
        "nickname|kind": {
          "0": "first",
          "1": "Internet",
          "2": "official",
          "3": "CS-GO"
        },
        "nickname": [
          "Jay-Jay",
          "@JJ",
          "Jules",
          "JB"
        ]
      }
    ]
  }
}
Copy

Reserved values

The string values uid(...), val(...) are not accepted.

Join our community