首页 文章

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

提问于
浏览
2

假设我有以下文档集:

  • 有姓名和学生ID的学生

  • 具有名称和类ID的类

  • 具有名称和位置ID的位置

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

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

  • 只有_from和_to引用的ClassLocations

在给定日期显示 class 和地点的情况下,为学生返回图表的最佳方法是什么?我一直在使用类似下面的内容,但它返回的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 回答

  • 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语句创建一个名为“counter”的变量,并将其分配给一个边数组,这些边的endDate大于给定日期或者没有endDate . 最终过滤器仅允许具有与“计数器”变量中的边数相同的边的路径 .

相关问题