使用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引用的类位置
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的边数组。最终过滤器只允许路径的边数与“计数器”变量中的边数相同