Now, to the D of the CRUD

You are deleting the “E-mail” Node directly. In this case it would be necessary to delete as “@reverse”. But I do not remember if there’s a way to do that via Json. But there is a better way. The sure thing would be you build the complete obj JSON and then use “null”. Like this:

{
            "uid": "0x01",
            "emails": null     # to delete all emails
}
{
   "uid": "0x01",
      "emails":  {
               "uid": "0x02" 
               #to delete only that link - This one is the right one
               # and will delete all  edges from 0x02.
               }  
}
{
  "uid": "0x02" 
# to delete all predicates, but will not delete the link if you have @reverse
# There will be a UID in the parent in case of @reverse
}

More details: Get started with Dgraph

Yes, there will be empty nodes. But the Dgraph will not return them without links between nodes.

If you prefer you can “recycle” these nodes. But you should do it manually via application. Add a predicate of type “_deletedNode” and you can search it with “has (_deletedNode)”. But this is in case you find it really necessary.

Do not worry about UIDs, there will be trillions of them to use.