我有一个用例,我需要在每个级别获得具有特定类型的顶点数量,直到定义的级别。 例如:
A有边缘到B(管理员),C(用户),D(管理员)
B(管理员)已将边缘输出到E(用户),F(用户),G(用户),H(管理员)
C(用户)有Edges到I(管理员),J(用户),K(管理员),L(管理员), M(管理员)
K(管理员)已将边缘移至N(管理员),O(用户),P(管理员),Q(管理员), R(管理员),S(用户),T(用户)
如果levels = 3,并且主题顶点为A,则结果应该是(格式可以不同):
level = 1,users = 1,admins = 2,total = 3
level = 2,users = 4,admins = 5,total = 9
level = 3,users = 3,admins = 4,total = 7
我有查询为我这样做,但由于我有大数据时的repeat(),它确实很慢。
for (int i = 0; i < levels; i++) {
Map<Object, Long> next =
graphTraversalSource.V().hasLabel(GraphDbConnection.USER)
.has(GraphDbConnection.UUID, "uuidValue").until(loops().is(i)).repeat(out())
.out().values(GraphDbConnection.MEMBER_TYPE).groupCount().next();
MemberSponsorMetrics memberSponsorMetrics = new MemberSponsorMetrics();
memberSponsorMetrics.setLevel(i + 1);
int users = next.getOrDefault(UserType.USER.ordinal(), (long) 0).intValue();
memberSponsorMetrics.setUsers(users);
int admins = next.getOrDefault(UserType.ADMIN.ordinal(), (long) 0).intValue();
memberSponsorMetrics.setAdmins(admins);
memberSponsorMetrics.setTotal(users + admins);
memberSponsorMetricsList.add(memberSponsorMetrics);
}
如何以有效的方式实现这些结果?我可以使用或其他什么特定的索引类型吗?我在顶点属性上有多个基本索引,但我不认为它们在这里很有用。
答案 0 :(得分:0)
示例图
g = TinkerGraph.open().traversal()
g.addV("person").property(id, "A").as("a").
addV("person").property("memberType", 1).property(id, "B").as("b").
addV("person").property("memberType", 0).property(id, "C").as("c").
addV("person").property("memberType", 1).property(id, "D").as("d").
addV("person").property("memberType", 0).property(id, "E").as("e").
addV("person").property("memberType", 0).property(id, "F").as("f").
addV("person").property("memberType", 0).property(id, "G").as("g").
addV("person").property("memberType", 1).property(id, "H").as("h").
addV("person").property("memberType", 1).property(id, "I").as("i").
addV("person").property("memberType", 0).property(id, "J").as("j").
addV("person").property("memberType", 1).property(id, "K").as("k").
addV("person").property("memberType", 1).property(id, "L").as("l").
addV("person").property("memberType", 1).property(id, "M").as("m").
addV("person").property("memberType", 1).property(id, "N").as("n").
addV("person").property("memberType", 0).property(id, "O").as("o").
addV("person").property("memberType", 1).property(id, "P").as("p").
addV("person").property("memberType", 1).property(id, "Q").as("q").
addV("person").property("memberType", 1).property(id, "R").as("r").
addV("person").property("memberType", 0).property(id, "S").as("s").
addV("person").property("memberType", 0).property(id, "T").as("t").
addE("link").from("a").to("b").
addE("link").from("a").to("c").
addE("link").from("a").to("d").
addE("link").from("b").to("e").
addE("link").from("b").to("f").
addE("link").from("b").to("g").
addE("link").from("b").to("h").
addE("link").from("c").to("i").
addE("link").from("c").to("j").
addE("link").from("c").to("k").
addE("link").from("c").to("l").
addE("link").from("c").to("m").
addE("link").from("k").to("n").
addE("link").from("k").to("o").
addE("link").from("k").to("p").
addE("link").from("k").to("q").
addE("link").from("k").to("r").
addE("link").from("k").to("s").
addE("link").from("k").to("t").iterate()
现在可以使用单次遍历来收集您正在寻找的结果,实际上不需要一遍又一遍地执行几乎相同的遍历(只需更改循环次数)。
gremlin> g.V("A").
repeat(out("link").
group("x").
by(loops()).
by(groupCount().
by(branch(values("memberType")).
option(0, constant("user")).
option(1, constant("admin"))))).
times(3).
cap("x")
==>[0:[admin:2,user:1],1:[admin:5,user:4],2:[admin:4,user:3]]
外部地图的键基本上是-1级。
此查询在TinkerGraph上大约需要1毫秒。所以除非你的分支因子要高得多,否则你应该很快得到结果。但是,如果分支因子很高并且您实际要处理数千个顶点,则应考虑在OLAP中运行此查询。