1

我有一个用例,我需要在每个级别获取特定类型的顶点数量,直到定义的级别。例如:

A 对 B(管理员)、C(用户)、D(管理员)有优势

B (admin) 对 E(user), F(user), G(user), H(admin) 有边

C(user) 对 I(admin), J(user), K(admin), L(admin), M(admin) 有边

K(admin) 对 N(admin), O(user), P(admin), Q(admin), R(admin), S(user), T(user) 有边

如果级别 = 3,并且主题顶点是 A,则结果应该是(格式可以不同):

级别=1,用户=1,管理员=2,总数=3

级别=2,用户=4,管理员=5,总数=9

级别=3,用户=3,管理员=4,总数=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);
}

我怎样才能以有效的方式实现这些结果?我可以使用任何特定的索引类型或其他东西吗?我确实有多个关于顶点属性的基本索引,但我认为它们在这里没有用。

4

1 回答 1

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]]

外层map的key基本都是level-1。

此查询在 TinkerGraph 上大约需要 1 毫秒。因此,除非您的分支因子要高得多,否则您应该很快就能得到结果。但是,如果分支因子很高并且您实际上要处理数千个顶点,则应考虑在 OLAP 中运行此查询。

于 2017-10-04T20:37:16.280 回答