使用ArangoDb AQL对不同的图边类型进行过滤

使用ArangoDb AQL对不同的图边类型进行过滤,arangodb,aql,Arangodb,Aql,假设我有以下文档集合: 有姓名和学号的学生 具有名称和类Id的类 具有名称和位置Id的位置 以及指定关系的以下边集合: 学生课堂上有_from和_to参考资料以及开始和结束日期 仅使用_from和_to引用的类位置 为学生返回给定日期的显示班级和地点的图表的最佳方式是什么?我一直在使用下面这样的东西,但它返回的StudentClass边缘不在日期范围内。此外,由于过滤器不在路径上,我相信所有边都将被遍历,这意味着这可能无法很好地缩放 FOR v, e, p IN 1..10 OUTBOU

假设我有以下文档集合:

  • 有姓名和学号的学生
  • 具有名称和类Id的类
  • 具有名称和位置Id的位置
以及指定关系的以下边集合:

  • 学生课堂上有_from和_to参考资料以及开始和结束日期
  • 仅使用_from和_to引用的类位置
为学生返回给定日期的显示班级和地点的图表的最佳方式是什么?我一直在使用下面这样的东西,但它返回的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
v、e、p的

在1..10出境“学生/1234”
学生班,班级地点
过滤器((e.endDate>“2017-10-01”)和(e.startDate<“2017-10-01”))
或(e.endDate==null)
返回p

多亏了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
v、e、p的

在1..10出境“学生/1234”
学生班,班级地点
过滤器p.edges[*].startDate ALL=@date
返回(e2)
过滤器计数(计数器)=计数(p边)
返回p
第一个过滤器确保所有边必须在@date bind参数中给定的日期(作为字符串)之前有一个startDate。没有startDate属性的边将通过此过滤器。(ArangoDb必须将null视为小于任何值的值。)

LET语句创建一个名为“counter”的变量,并将其分配给endDate大于给定日期或没有endDate的边数组。最终过滤器只允许路径的边数与“计数器”变量中的边数相同