Gremlin repeat()查询需要很长时间

时间:2017-10-04 19:35:37

标签: gremlin tinkerpop3 gremlin-server janusgraph

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

  

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);
}

如何以有效的方式实现这些结果?我可以使用或其他什么特定的索引类型吗?我在顶点属性上有多个基本索引,但我不认为它们在这里很有用。

1 个答案:

答案 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中运行此查询。