我在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 回答
1)为了过滤
cat
中的条目"c":2
,对于路径上的所有边(p.edges[*]
),必须检查cat
数组(.cat[*]
)的c
属性(.c
)是否包含值[2]
.因此,在访问子属性数组
p.edges[*].cat[*].c
时,我们使用IN
运算符 .2)也可以通过访问以下子属性来调整
return
格式:调整后的查询是: