如何在 Gremlin 遍历中使用 sideEffect 和 dedup?
How to use sideEffect and dedup in a Gremlin traversal?
背景
我们正在尝试建立一个查询,以便对于给定的 label
我们想要获得该 label
类型的 all 邻居获取 ID 列表。我们有大约 5 个不同的标签,因此我们正在构建遍历以在单个查询中完成所有操作。
目标
我们要确保对于给定的 label
,我们查询 N 个邻居,并且对于 idsToBatchQuery
列表中的所有聚合邻居,我们将它们全部删除。
我们面临的问题是副作用只是对每个顶点进行重复数据删除。
例如 - 如果我们在 idsToBatchQuery
列表中有 10 个顶点并且每个顶点有 3 个邻居,我们只对这 3 个邻居进行重复数据删除,而不是对 30 个完整的邻居列表进行重复数据删除。
问题
我们如何修改以下查询以从 idsToBatchQuery
中的所有顶点中获取前 maxBreadth
个唯一邻居?
var traversal = g.V(idsToBatchQuery.toArray())
for (String label : labels) {
traversal =
traversal.sideEffect(
outE(EDGE_LABEL)
.inV()
.hasLabel(label)
.dedup()
.by(T.id)
.limit(maxBreadth)
.aggregate(label));
}
使用air-routes数据集,这里是一个类似的查询,但是dedup
这一步被where(without('labels'))
代替了。这提供了对所有值的更全局重复数据删除,而不仅仅是两个“本地”值。
g.V('1','2','3','56').
sideEffect(
outE('route').
inV().
hasLabel('airport').
where(without('labels')).
limit(2).
aggregate('labels')).
sideEffect(
inE('contains').
outV().
hasLabel('country').
where(without('labels')).
limit(2).
aggregate('labels')).
cap('labels').
unfold().
values('desc')
这是 运行 查询的输出。如果像在您的原始查询中那样使用 dedup
,结果会重复。
1 Ontario International Airport
2 Greater Rochester International Airport
3 United States
4 Fairbanks International Airport
5 Reykjavik, Keflavik International Airport
6 Charlotte Douglas International Airport
7 Cancun International Airport
8 Phnom Penh International Airport
9 Gold Coast Airport
10 Singapore
如果使用原来的dedup
,可以看到结果有重复
1 Ontario International Airport
2 Ontario International Airport
3 Greater Rochester International Airport
4 United States
5 United States
6 United States
7 Fairbanks International Airport
8 Reykjavik, Keflavik International Airport
9 Charlotte Douglas International Airport
10 Phnom Penh International Airport
背景
我们正在尝试建立一个查询,以便对于给定的 label
我们想要获得该 label
类型的 all 邻居获取 ID 列表。我们有大约 5 个不同的标签,因此我们正在构建遍历以在单个查询中完成所有操作。
目标
我们要确保对于给定的 label
,我们查询 N 个邻居,并且对于 idsToBatchQuery
列表中的所有聚合邻居,我们将它们全部删除。
我们面临的问题是副作用只是对每个顶点进行重复数据删除。
例如 - 如果我们在 idsToBatchQuery
列表中有 10 个顶点并且每个顶点有 3 个邻居,我们只对这 3 个邻居进行重复数据删除,而不是对 30 个完整的邻居列表进行重复数据删除。
问题
我们如何修改以下查询以从 idsToBatchQuery
中的所有顶点中获取前 maxBreadth
个唯一邻居?
var traversal = g.V(idsToBatchQuery.toArray())
for (String label : labels) {
traversal =
traversal.sideEffect(
outE(EDGE_LABEL)
.inV()
.hasLabel(label)
.dedup()
.by(T.id)
.limit(maxBreadth)
.aggregate(label));
}
使用air-routes数据集,这里是一个类似的查询,但是dedup
这一步被where(without('labels'))
代替了。这提供了对所有值的更全局重复数据删除,而不仅仅是两个“本地”值。
g.V('1','2','3','56').
sideEffect(
outE('route').
inV().
hasLabel('airport').
where(without('labels')).
limit(2).
aggregate('labels')).
sideEffect(
inE('contains').
outV().
hasLabel('country').
where(without('labels')).
limit(2).
aggregate('labels')).
cap('labels').
unfold().
values('desc')
这是 运行 查询的输出。如果像在您的原始查询中那样使用 dedup
,结果会重复。
1 Ontario International Airport
2 Greater Rochester International Airport
3 United States
4 Fairbanks International Airport
5 Reykjavik, Keflavik International Airport
6 Charlotte Douglas International Airport
7 Cancun International Airport
8 Phnom Penh International Airport
9 Gold Coast Airport
10 Singapore
如果使用原来的dedup
,可以看到结果有重复
1 Ontario International Airport
2 Ontario International Airport
3 Greater Rochester International Airport
4 United States
5 United States
6 United States
7 Fairbanks International Airport
8 Reykjavik, Keflavik International Airport
9 Charlotte Douglas International Airport
10 Phnom Penh International Airport