0

在我的图表中,一个用户连接到许多项目,每个项目可以递归地划分为许多子项目。由于我的项目有一个特定的顺序,我正在考虑这两个选项来建模我的数据:

在此处输入图像描述

现在我想创建一个查询来检索给定用户 ID 的两个级别的项目。这个 AQL 是我的第一次尝试:

for itemId in (for b in board filter b._from == @_from sort b.order return b._to)
    for item1 in (for t in item filter t._id == itemId return keep(t, '_id', 'title'))
        return merge(item1, {board: (
            for itemId2 in (for b in board filter b._from == item1._id sort b.order return b._to)
                for t in item filter t._id == itemId2 return keep(t, '_id', 'title')
        )})

该查询有效,并输出如下结果:

[
  {
    "title": "item 1",
    "_id": "item/41260117498",
    "board": [
      {
        "title": "item 4",
        "_id": "item/42205736442"
      },
      {
        "title": "item 5",
        "_id": "item/42208423418"
      }
    ]
  },
  {
    "title": "item 2",
    "_id": "item/41260772858",
    "board": []
  },
  {
    "title": "item 3",
    "_id": "item/41883233786",
    "board": []
  }
]

这很好,但我觉得我的查询对于这样一个简单的遍历来说是不必要的复杂。有人可以帮我创造一个更好的吗?

4

1 回答 1

1

使用图形数据库的重点是利用其图形查询功能,让它处理边缘,而不是通过手动连接边缘来自行完成。

我将演示这种查询的模式匹配遍历;他们在引擎盖下透明地为您处理边缘(_from和)的过渡。_to

首先,您将创建一个图来配置您的边缘关系,为简单起见,我们使用匿名图。你有边缘集合board和顶点集合useritem.

首先,您只需运行整个查询以了解它是如何工作的,然后检查完​​整的结果:

FOR v, e, p IN 1..3 OUTBOUND 'user/andy' board RETURN {v: v, e: e, p: p}

您看到您只需要指定起始节点和边集合board,它会通过检查边找到要自行查询的顶点集合。

现在我们可以添加FILTERs 来省略我们不喜欢的边和顶点:

FOR v, e, p IN 1..3 OUTBOUND 'user/andy' board 
   FILTER e.title == 'item 2'
   FILTER p.edges[1].title != 'item 1'
   RETURN {v: v, e: e, p: p}

该示例包含两条FILTER指令;一个是匹配每条边以使title属性相等"item 2",另一个是匹配遍历中的第一条边必须包含title "item 1"

最后,我们使用文档操作来仅获取我们喜欢的文档部分:

FOR v, e, p IN 1..3 OUTBOUND 'user/andy' board 
   FILTER e.title == 'item 2' 
   RETURN {v: v, e: {title: e.title, _id: e._id}, pathEdgeTitle: p.edges[*].title}
于 2016-06-15T17:15:32.740 回答