2016-06-07 33 views
0

以我曲线图中,用户连接到许多项目,每个项目都被递归地分割成许多子项。由于我的项目有一个特定的顺序,我考虑这两个选项,我的数据模型:想法提高我AQL查询

enter image description here

现在我想创建一个查询检索中的两个级别定UserID。这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": [] 
    } 
] 

这很好,但我觉得我的查询是这样一个简单的穿越不必要的复杂性。请有人帮助我创造一个更好的吗?

回答

1

在使用graph database点是利用其图形查询功能让它处理的边缘,而不是由人工加入的边缘,做你自己。

我将演示pattern matching traversals这样的查询;他们在透气的底部为你处理边缘(_from_to)的透视。

首先你会create a graph配置您的边缘关系,我们使用了简单的匿名图表。你有优势集合board和顶点集合useritem

首先,你干脆让运行整个查询来获取它是如何工作的感觉,并察看了一个满结果:

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

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

现在,我们可以添加FILTER s到忽略边和顶点,我们不喜欢:

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"

Finaly我们use document manipulation只获取文件的部分我们喜欢:

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}