如何显示arangoDB中的所有子边节点[nth level like neo4J]

hpxqektj  于 2022-12-09  发布在  Go
关注(0)|答案(1)|浏览(134)

设置了具有100万条记录事件集合已成功设置ChildEvents边缘集合

FOR c IN events
        FOR p IN events  
            FILTER p.mynum == ( c.mynum + 1 )
                INSERT { _from: c._id, _to: p._id}  INTO ChildEvents
                    RETURN $NEW

记录总数:现在我需要显示给定节点的所有父节点或子节点。在本例中,我希望下面的查询返回从350到99999的所有节点。(350 --〉351 --〉352 --〉....999999)FOR v IN OUTBOUND“events/350”any ChildEvents RETURN v但是这个查询只返回2个记录。返回的记录数。在这种情况下如何得到n.记录数?
对于相同的设置,如果我们使用neo4J,它将返回所有节点,我希望这里有相同的行为。
非常感谢您的帮助。

k75qkfdt

k75qkfdt1#

因此,子节点将具有mynum的最小值,而父节点将具有较高的值,对吗?对于测试集,我创建了一个events表,如下所示:

FOR n IN 1..99999
    LET doc = { mynum: n }
    INSERT doc INTO events

mynum上创建了一个持久散列索引之后,我创建了如下所示的边:

FOR c IN events
    FOR p IN events
        FILTER p.mynum == ( c.mynum + 1 )
        LET edge = { _from: c._id, _to: p._id }
        INSERT edge INTO ChildEvents

这将生成一个“从子级到父级”的图形,如下所示:

parent  <---  child  [ <---  child(n) ... ]

然后,从一个节点(比如mynum == 50)开始,获取从hop x到hop y的所有OUTBOUND边(参见匿名图文档)。我限制了这些值(0到100),以保持返回文档的数量较低,但可以使用任何值。

FOR event in events
    FILTER event.mynum == 50
    FOR v IN 0..100 OUTBOUND event
        ChildEvents
        RETURN v

它返回101个文档,从mynum: 50开始,如下所示:

[
  {
    "_id": "events/285436",
    "mynum": 50
  },
  {
    "_id": "events/285437",
    "mynum": 51
  },
  {
    "_id": "events/285438",
    "mynum": 52
  },
  ...
]

x设置为0将返回起始节点,但将其更改为1将排除该节点,开始返回一个跃点之外的节点:

[
  {
    "_id": "events/285436",
    "mynum": 51
  },
  {
    "_id": "events/285437",
    "mynum": 52
  },
  {
    "_id": "events/285438",
    "mynum": 53
  },
  ...
]

考虑到这一点,我们可以从图中的任何一点返回节点。

FOR event in events
    FILTER event.mynum == 50
    FOR v IN 99..100 OUTBOUND event
        ChildEvents
        RETURN v

...只会传回两个节点:

[
  {
    "_id": "events/285535",
    "mynum": 149
  },
  {
    "_id": "events/285536",
    "mynum": 150
  }
]

您还可以通过变量定义“跳数”值:

LET n_start = 100
LET n_end = 999
FOR event in events
    FILTER event.mynum == 50
    FOR v IN n_start..n_end OUTBOUND event
        ChildEvents
        RETURN v

看起来您无法从表中驱动它们(DB无法构建计划),但您可以创建绑定参数并以这种方式传递值:

/* JavaScript */
const aql = [
    'FOR event in events',
    '    FILTER event.mynum == 50',
    '    FOR v IN @n_start..@n_end OUTBOUND event',
    '        ChildEvents',
    '        RETURN v',
];
const vars = {
    n_start: 100,
    n_end: 999,
};
const result = await db._query(aql.join('\n'), vars).toArray();

使用绑定参数取决于语言,但以下链接可帮助您入门:

  • 超文本传输协议
  • db(阿拉伯语或Foxx)
  • JavaScript语言
  • java

相关问题