Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gremlin repeat()查询需要很长时间_Gremlin_Tinkerpop3_Gremlin Server_Janusgraph - Fatal编程技术网

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

Gremlin repeat()查询需要很长时间,gremlin,tinkerpop3,gremlin-server,janusgraph,Gremlin,Tinkerpop3,Gremlin Server,Janusgraph,我有一个用例,在这个用例中,我需要得到每个级别上具有特定类型的顶点的数量,直到定义的级别。 例如: A向B(管理员)、C(用户)、D(管理员)输出边 B(管理员)对E(用户)、F(用户)、G(用户)、H(管理员)具有外边缘 C(用户)对I(管理员)、J(用户)、K(管理员)、L(管理员)具有外边缘, M(行政) K(管理员)对N(管理员)、O(用户)、p(管理员)、Q(管理员)有边缘, R(管理员)、S(用户)、T(用户) 如果级别=3,且主题顶点为A,则结果应为(格式可以不同): 级别=1,用

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

A向B(管理员)、C(用户)、D(管理员)输出边

B(管理员)对E(用户)、F(用户)、G(用户)、H(管理员)具有外边缘

C(用户)对I(管理员)、J(用户)、K(管理员)、L(管理员)具有外边缘, M(行政)

K(管理员)对N(管理员)、O(用户)、p(管理员)、Q(管理员)有边缘, R(管理员)、S(用户)、T(用户)

如果级别=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);
}
for(int i=0;i

如何以有效的方式实现这些结果?有什么具体的索引类型可以使用吗?我确实有多个关于顶点属性的基本索引,但我认为它们在这里没有用处

示例图

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()
现在,您要查找的结果可以使用单个遍历来收集,实际上不需要反复执行几乎相同的遍历(只需更改循环的数量)

外部贴图的关键点基本上是级别-1


此查询在TinkerGraph上大约需要1毫秒。因此,除非你的分支因子高得多,否则你应该很快得到结果。但是,如果分支因子很高,实际上要处理上千个顶点,那么你应该考虑在OLAP中运行这个查询。
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()
现在,您要查找的结果可以使用单个遍历来收集,实际上不需要反复执行几乎相同的遍历(只需更改循环的数量)

外部贴图的关键点基本上是级别-1


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

A转到B和C,因此在你的示例中只有2个级别,不是吗?是的,我更新了我的数据,并且还增加了一个级别3A到B和C,因此,在您的示例中只有两个级别,不是吗?是的,您是对的,我更新了我的数据,还为级别3添加了一个级别。因此,我想我忘了提到两件事,“user”和“admin”将是vertex属性的值(比如key=memberType),而该值不是字符串,我只是将其用作字符串来解释问题,它们是整数(0=用户,1=管理员)。当您使用groupCount().by('memberType')时,它不会产生相同的输出,而是将所有输出相加并返回“[0:[admin:7,user:5]]”。使用您的示例,将“by(label)”替换为by('memberType')。我使用大数据运行了您的查询和我的查询,并且查询运行7次(7级)的总时间而您的查询运行1次以获得相同的结果所用的时间也差不多。-我仍然无法返回数组结果以获取每个级别的显示方式,我的结果返回为整个组(所有级别)的总和,如“{0={1=1487,2=185}”检查更新。我真的不知道你所说的“全部合计”是什么意思,这不是我观察到的行为。例如,我仍然在合计它们-如果我对我的数据运行与你发布的相同的查询,而不是获取具有3个级别的数组,我只获取具有1个级别的对象,但值是所有级别的合计-“{0:{admin:11,user:8}”所以-admin=2+5+4和user=1+4+3我意识到了这个问题,我使用的是JanusGraph,而不是直接使用Tinkerpop。我在tinkerpop控制台中运行了相同的查询,它输出了您提供的预期结果。不确定为什么通过janusgraph使用gremlin是不同的-有什么想法吗?所以,我想我忘了提到两件事,“user”和“admin”将是顶点属性的值(比如key=memberType),而值不是字符串,我只是用它作为字符串来解释问题,它们是整数(0=user,1=admin)。当您使用groupCount().by('memberType')时,它不会产生相同的输出,而是将所有输出相加并返回“[0:[admin:7,user:5]]”。使用您的示例,将“by(label)”替换为by('memberType')。我使用大数据运行了您的查询和我的查询,并且查询运行7次(7级)的总时间而您的查询运行1次以获得相同的结果所用的时间也差不多。-我仍然无法返回数组结果以获取每个级别的显示方式,我的结果返回为整个组(所有级别)的总和,如“{0={1=1487,2=185}”检查更新。我真的不知道你所说的“全部合计”是什么意思,这不是我观察到的行为。例如,我仍然在合计它们-如果我对我的数据运行与你发布的相同的查询,而不是获取具有3个级别的数组,我只获取具有1个级别的对象,但值是所有级别的合计-“{0:{admin:11,user:8}”所以-admin=2+5+4和user=1+4+3我意识到了这个问题,我正在使用