使用ArangoDb AQL过滤不同的图形边缘类型

时间:2017-10-18 00:52:21

标签: arangodb aql

假设我有以下文件集:

  • 有姓名和学生ID的学生
  • 具有名称和类ID的类
  • 包含姓名和位置ID的地点

以及指定关系的以下边集:

  • 带有_from和_to的StudentClass以及开始和结束日期
  • 只有_from和_to引用的ClassLocations

在给定日期显示课程和地点的情况下,为学生返回图表的最佳方法是什么?我一直在使用类似下面的内容,但它返回的StudentClass边缘不在日期范围内。此外,由于过滤器不在路径上,我相信所有边缘都将被遍历,这意味着这可能无法很好地扩展。

FOR v, e, p
IN 1..10 OUTBOUND "Students/1234"
StudentClass, ClassLocations 
FILTER ((e.endDate > "2017-10-01") AND (e.startDate < "2017-10-01"))
 OR (e.endDate == null)
RETURN p

1 个答案:

答案 0 :(得分:1)

感谢mark.arangodb,我已经能够创建一个可行的解决方案:

FOR v, e, p
IN 1..10 OUTBOUND "Students/1234"
StudentClass, ClassLocations 
FILTER p.edges[*].startDate ALL <= @date
LET counter = (FOR e2 IN p.edges 
               FILTER NOT_NULL(e2.endDate, @date) >= @date 
               RETURN e2)
FILTER COUNT(counter) == COUNT(p.edges) 
RETURN p

第一个过滤器确保所有边必须在@date绑定参数中给定日期(作为字符串)之前具有startDate。没有startDate属性的边传递此过滤器。 (ArangoDb必须将null视为小于任何值的值。)

LET语句创建一个名为&#34; counter&#34;的变量。并将其分配给一个边数组,这些边的endDate大于给定日期或者没有endDate。最终过滤器仅允许具有与&#34;计数器&#34;中相同数量边缘的路径。变量