删除另一个集合中的文档时如何一起删除边集合文档?

时间:2017-11-27 06:28:09

标签: graph-databases arangodb referential-integrity

我正在公司练习arangodb。 当我想在用户和用户之间表达以下关系时,我想在删除一个用户时删除相应的以下关系的数据。

用户集合

{
    "_key": "test4",
    "_id": "users/test4",
    "_rev": "_V8yGRra---"
  },
  {
    "_key": "test2",
    "_id": "users/test2",
    "_rev": "_V8whISG---"
  },
  {
    "_key": "test1",
    "_id": "users/test1",
    "_rev": "_V8whFQa---"
  },
  {
    "_key": "test3",
    "_id": "users/test3",
    "_rev": "_V8yoFWO---",
    "userKey": "test3"
  }

关注收集[edge]

{
    "_key": "48754",
    "_id": "follow/48754",
    "_from": "users/test1",
    "_to": "users/test2",
    "_rev": "_V8wh4Xe---"
  }
  {
    "_key": "57447",
    "_id": "follow/57447",
    "_from": "users/test2",
    "_to": "users/test3",
    "_rev": "_V8yHGQq---"
  }

2 个答案:

答案 0 :(得分:1)

如果使用得当,ArangoDB系统可确保命名图(GRAPH)的完整性。

要手动删除特定用户(例如" users / test4")和follow中的相应边缘,沿着以下行的AQL查询应足以删除边缘:

for v,e IN 1..1 ANY "users/test4" follow
  REMOVE e IN follow
  COLLECT WITH COUNT INTO counter
  RETURN counter

假设"用户/ test4"如果未在别处引用,则可以安全地删除该节点,例如,由

 REMOVE "test4" in users

重要的一点是,在手动删除节点时,必须明确标识和管理所有相关的edge集合。

答案 1 :(得分:0)

首先,您应该使用顶点和边集合创建图形。使用图表,您可以使用REST API删除顶点。这样,所有指向此顶点的边和顶点本身都将被删除。

DELETE /_api/gharial/{graph-name}/vertex/{collection-name}/{vertex-key}

您可以在https://docs.arangodb.com/3.2/HTTP/Gharial/Vertices.html#remove-a-vertex下找到包含示例的文档。

也可以通过AQL查询实现此目的,例如从users集合中删除test1:

LET keys = (
  FOR v, e IN 1..1 ANY 'users/test1' GRAPH 'your-graph-name' RETURN e._key)
    LET r = (FOR key IN keys REMOVE key IN follow) REMOVE 'test1' IN users

图遍历用于获取指向test1的所有边的_key属性,然后从follow集合中删除这些边,并从users集合中删除test1。 / p>