Sorting 按用户书籍列表的二级邻居(作者)属性对直接邻居节点(书籍)排序?

Sorting 按用户书籍列表的二级邻居(作者)属性对直接邻居节点(书籍)排序?,sorting,graph,arangodb,graph-traversal,aql,Sorting,Graph,Arangodb,Graph Traversal,Aql,agheranimesh通过Slack: 这是我的图形,名为LibraryGraph: 我的图形查询: FOR v, e, p IN 1..2 OUTBOUND "User/001" GRAPH "LibraryGraph" SORT p.vertices[2].Name RETURN p.vertices[1] 它没有给我想要的结果。我想要一个按作者姓名排序的图书列表,没有作者的图书应该排在最后(B2、B3、B1、B4、B5) 用于重新创建数据的脚本(arangosh--ja

agheranimesh通过Slack:

这是我的图形,名为LibraryGraph:

我的图形查询:

FOR v, e, p IN 1..2 OUTBOUND "User/001" GRAPH "LibraryGraph"
   SORT p.vertices[2].Name
   RETURN  p.vertices[1]
它没有给我想要的结果。我想要一个按作者姓名排序的图书列表,没有作者的图书应该排在最后(B2、B3、B1、B4、B5)

用于重新创建数据的脚本(
arangosh--javascript.execute
):


我建议使用两种遍历,而不是一种具有可变深度(1..2)的遍历来覆盖这两种情况,即有作者和无作者的书籍:

FOR book IN OUTBOUND "User/001" GRAPH "LibraryGraph"
    LET author = FIRST(
        FOR author IN OUTBOUND book._id GRAPH "LibraryGraph"
            SORT author.Name
            LIMIT 1
            RETURN author.Name
    ) OR "\uFFFF"
    SORT author
    RETURN book
首先,我们从
User/001
遍历到链接的书籍。然后我们从每本书到链接的作者进行第二次遍历。这可能会返回0、1或多个作者。子查询将结果限定为按字母顺序排列的第一作者(例如,X、Y、Z中的X),并返回名称

在主查询的范围内,我们采用作者姓名或回退到一个值,该值在排序时最后结束(
null
将首先结束,这在这里是不需要的)。然后,我们按作者姓名对书籍进行排序并返回:

实现这一结果的另一种方法更难理解:

FOR v, e, p IN 1..2 OUTBOUND "User/001" GRAPH "LibraryGraph"
    LET name = p.vertices[2].Name OR "\uFFFF"
    COLLECT book = p.vertices[1] AGGREGATE author = MIN(name)
    SORT author
    RETURN book
遍历返回具有2个或3个顶点的路径

   [0]         [1]         [2]
User/001 --> Book/B2
User/001 --> Book/B2 --> Author/A
User/001 --> Book/B3
User/001 --> Book/B3 --> Author/B
User/001 --> Book/B4
User/001 --> Book/B5
User/001 --> Book/B1
User/001 --> Book/B1 --> Author/Y
User/001 --> Book/B1 --> Author/X
User/001 --> Book/B1 --> Author/Z
索引2(
p.vertices[2]
)或回退值处的作者临时存储在变量
name
中。然后将书本顶点分组在一起以消除重复(由可变的遍历深度引起,它返回例如
001-->B2
,但也返回较长的路径
001-->B2-->A

聚合用于选择具有最低值(
MIN
)的作者姓名,这通常意味着按字母顺序排在第一位-但是,对于某些语言和字符集,聚合可能无法正常工作,而
SORT
会根据集合语言的规则正确排序(每个DBMS实例只能有一个)

分组结果(不同的图书文档)按作者姓名排序并返回

   [0]         [1]         [2]
User/001 --> Book/B2
User/001 --> Book/B2 --> Author/A
User/001 --> Book/B3
User/001 --> Book/B3 --> Author/B
User/001 --> Book/B4
User/001 --> Book/B5
User/001 --> Book/B1
User/001 --> Book/B1 --> Author/Y
User/001 --> Book/B1 --> Author/X
User/001 --> Book/B1 --> Author/Z