【问题标题】:Traverse Arangodb graph with array filtering on edges使用边上的数组过滤遍历 Arangodb 图
【发布时间】:2018-08-04 17:47:09
【问题描述】:

我在 arangodb 中有这个测试图

节点:

[  { "_key": "A", "name": "A", "sector": "a"},
{ "_key": "B", "name": "B", "sector": "a"},
{ "_key": "C1", "name": "C1", "sector": "c"},
{ "_key": "C2", "name": "C2", "sector": "c"},
{ "_key": "C3", "name": "C3", "sector": "c"},
{ "_key": "C4", "name": "C4", "sector": "c"},
{ "_key": "D1", "name": "D1", "sector": "d"},
{ "_key": "D2", "name": "D2", "sector": "d"},
{ "_key": "E1", "name": "E1", "sector": "e"},
{ "_key": "E2", "name": "E2", "sector": "e"},
{ "_key": "E3", "name": "E3", "sector": "e"}]

边:

[{ "_from": "V/A","_to": "V/D1", "cat": [{"c":1,"s":3}] },
{ "_from": "V/A","_to": "V/D2", "cat": [{"c":1,"s":1}] },
{ "_from": "V/B","_to": "V/D2", "cat": [{"c":2,"s":1}] },
{ "_from": "V/D1","_to": "V/E1", "cat": [{"c":1,"s":8}] }, 
{ "_from": "V/D1","_to": "V/E2", "cat": [{"c":1,"s":4}] },
{ "_from": "V/D2","_to": "V/E2", "cat": [{"c":1,"s":3},{"c":2,"s":4}] },
{ "_from": "V/D2","_to": "V/E3", "cat": [{"c":2,"s":4}] },
{ "_from": "V/C1","_to": "V/B", "cat": [{"c":2,"s":5}] },
{ "_from": "V/C1","_to": "V/A", "cat": [{"c":1,"s":6}] },
{ "_from": "V/C2","_to": "V/A", "cat": [{"c":1,"s":2}] },
{ "_from": "V/C3","_to": "V/A", "cat": [{"c":1,"s":1}] },
{ "_from": "V/C4","_to": "V/A", "cat": [{"c":1,"s":1}] },
{ "_from": "V/C4","_to": "V/B", "cat": [{"c":2,"s":2}] } ]

它是更大图的简化部分(几乎一千个节点,几千条边)。请注意,在此示例中,每条边都有一个属性“cat”作为类别对象的数组。实际上,在真实的数据集中,每条边都是一个或多个网络的一部分。有 22 个网络/类别。在这个工作示例中,只有两个,1 和 2。每条边都是一个类别的一部分,除了 D2->E3 是这里唯一的一个作为两个类别的成员。

问题:我必须从给定顶点开始,通过过滤/选择所选类别(真实数据中的网络)及其相关顶点的边来遍历图形。当然,避免循环和重复的顶点或边。

示例:从 B 开始,选择类别 2,我需要返回这个集合: v: [B,D2,E2,E3,C1,C4] 和 e: [{B->D2, D2->E2, D2->E3, C1->B, C4->B]

在 AQL 中,我尝试了各种过滤器:

FOR v, e, p IN 0..3 any "nodes/D2" edges OPTIONS {bfs: true, uniqueVertices: 'global'}
  //Here, the filter for cat 2  ?
return p

没有任何效果(当然,我是 Arango 的新手)。

问题一:如何构造过滤器?

问题 2:如何像上例那样格式化结果?更准确地说(每个数组中对象的顺序无关紧要):

[
  nodes: [{name:"B",sector:"a"}, {name:"D2",sector:"d"}, {name:"E2",sector:"e"}, ...]
  edges: [{source: "B", target: "D2", s:1}, {source: "D2", target: "E2", s:4}, ...]
]

感谢您的帮助。

【问题讨论】:

    标签: arangodb aql


    【解决方案1】:

    1) 为了过滤cat 中的条目"c":2,对于路径上的所有边(p.edges[*]),必须检查@987654326 的c 属性(.c)是否@array (.cat[*]) 包含值[2]

    因此我们在访问子属性数组p.edges[*].cat[*].c时使用IN运算符。

    FILTER [2] IN p.edges[*].cat[*].c
    

    2) return 格式也可以通过访问子属性来调整,例如:

    return {'nodes':{'name':v.name,'sector':v.sector},'edges':{'source':e._from,'target':e._to, 's': e.cat[*].s}}
    

    调整后的查询是:

    FOR v, e, p IN 0..3 any "V/D2" edges
    FILTER [2] IN p.edges[*].cat[*].c
    return {'nodes':{'name':v.name,'sector':v.sector},'edges':{'source':e._from,'target':e._to, 's': e.cat[*].s}}
    

    【讨论】:

    • 感谢@Maximilian Kernbach,但它不起作用。我使用了查询: FOR v, e, p IN 0..3 any "V/D2" E FILTER [1] IN p.edges[].cat[].c return {'nodes ':{'name':v.name,'sector':v.sector},'edges':{'source':e._from,'target':e._to,'cat':e.cat}}我得到了这个节点(几乎所有):
    • {"name":"D1","sector":"d"} {"source":"V/D1","target":"V/E2","cat": [{"c":1,"s":4}]} {"name":"E1","sector":"e"} {"source":"V/D1","target":"V /E1","cat":[{"c":1,"s":8}]} {"name":"A","sector":"a"} {"source":"V/A ","target":"V/D1","cat":[{"c":1,"s":3}]} {"name":"A","sector":"a"} { "源":"V/A","目标":"V/D2","cat":[{"c":1,"s":1}]} {"name":"D1","扇区":"d"} {"源":"V/A","目标":"V/D1","cat":[{"c":1,"s":3}]} {"名称":"E1","扇区":"e"} {"源":"V/D1","目标":"V/E1","cat":[{"c":1,"s ":8}]}
    • {"name":"E1","sector":"e"} {"source":"V/D1","target":"V/E1","cat": [{"c":1,"s":8}]} {"name":"E2","sector":"e"} {"source":"V/D1","target":"V /E2","cat":[{"c":1,"s":4}]} {"name":"C1","sector":"c"} {"source":"V/C1 ","target":"V/A","cat":[{"c":1,"s":6}]} {"name":"B","sector":"a"} { "源":"V/C1","目标":"V/B","cat":[{"c":2,"s":5}]} {"name":"C4","扇区":"c"} {"源":"V/C4","目标":"V/A","cat":[{"c":1,"s":1}]} {"名称":"B","扇区":"a"} {"源":"V/C4","目标":"V/B","cat":[{"c":2,"s ":2}]}
    • {"name":"C3","sector":"c"} {"source":"V/C3","target":"V/A","cat": [{"c":1,"s":1}]} {"name":"C2","sector":"c"} {"source":"V/C2","target":"V /A","cat":[{"c":1,"s":2}]} {"name":"A","sector":"a"} {"source":"V/C1 ","target":"V/A","cat":[{"c":1,"s":6}]} {"name":"A","sector":"a"} { "source":"V/C4","target":"V/A","cat":[{"c":1,"s":1}]}
    • {"source":"V/C1","target":"V/B","cat":[{"c":2,"s":5} ] 不应该在那里!
    猜你喜欢
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多