首页 文章

遍历边缘上的数组滤波的Arangodb图

提问于
浏览
1

我在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的新人) .

问题1:如何构建过滤器?

问题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}, ...]
]

感谢帮助 .

1 回答

  • 0

    1)为了过滤 cat 中的条目 "c":2 ,对于路径上的所有边( p.edges[*] ),必须检查 cat 数组( .cat[*] )的 c 属性( .c )是否包含值 [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}}
    

相关问题