Gremlin查询以检索具有它们之间多个边缘的顶点

3

enter image description here

考虑上述图表。我想要一个gremlin查询,返回在图表中显示的具有多个边缘的所有节点。
此图表是使用neo4j cypher查询获得的: MATCH (d:dest)-[r]-(n:cust) WITH d,n,count(r)作为popular RETURN d,n ORDER BY popular desc LIMIT 5
例如:在RITUPRAKA...和Asia之间有8个多个边缘,因此查询已返回2个节点以及边缘,其他节点同样如此。
请注意:图表中还有仅具有单个边缘的其他节点,这些节点将不会被返回。
我想在gremlin中做同样的事情。
我已经使用以下查询: g.V().as('out').out().as('in').select('out','in').groupCount().unfold().filter(select(values).is(gt(1))).select(keys)
它显示了 out:v [1234],in:v [3456] .....
但是,我想要显示节点的值而不是节点的ID,例如:out:ICIC1234,in:HDFC234。
我已经修改了查询语句为:g.V().values("name").as('out').out().as('in').values("name").select('out','in').groupCount().unfold().filter(select(values).is(gt(1))).select(keys)。
但是,它显示了类转换异常错误,每个遍历的顶点都需要使用索引进行快速迭代。
2个回答

5

您的图表似乎没有显示双向边是可能的,所以我将在考虑该假设的情况下回答。这里是一个简单的样本图表 - 请考虑在未来的问题中包含一个样本图表,因为对于阅读您的问题并开始编写Gremlin遍历来帮助您的人来说,它比图片和文本描述更容易理解:

g.addV().property(id,'a').as('a').
  addV().property(id,'b').as('b').
  addV().property(id,'c').as('c').
  addE('knows').from('a').to('b').
  addE('knows').from('a').to('b').
  addE('knows').from('a').to('c').iterate()

从这里可以看出,顶点“a”有两条指向“b”的出边和一条指向“c”的出边,因此我们应该得到“a b”这对顶点。一种方法是使用:

gremlin> g.V().as('out').out().as('in').
......1>   select('out','in').
......2>   groupCount().
......3>   unfold().
......4>   filter(select(values).is(gt(1))).
......5>   select(keys)
==>[out:v[a],in:v[b]]

上述遍历使用groupCount()计算“out”和“in”标记的顶点出现的次数(即它们之间的边数)。它使用unfold()迭代通过<Vertex Pairs,Count>Map(或更确切地说是<List<Vertex>,Long>),并过滤出计数大于1的那些(即多条边)。最后的select(keys)删除了“count”,因为它不再需要(即我们只需要保存顶点对结果的键)。
也许另一种方法是使用这种方法:
gremlin> g.V().filter(outE()).
......1>   project('out','in').
......2>     by().
......3>     by(out().
......4>        groupCount().
......5>        unfold().
......6>        filter(select(values).is(gt(1))).
......7>        select(keys)).
......8>   select(values)
==>[v[a],v[b]]

使用project()方法的这种方法放弃了在整个图上进行大量groupCount()所需的更重的内存要求,而是构建一个较小的Map,该Map仅涉及一个Vertex,并且在by()结束时(或者基本上每个初始顶点被处理后)可以进行垃圾回收。


请问您能告诉我值和键在查询中是如何定义的吗?当我尝试运行您提供的第一个查询时,它显示了以下错误:g.V().as('out').out().as('in').select('out','in').groupCount().unfold().filter(select(values).is(2)).select(keys)。groovysh_evaluate类没有名为“values”的属性。 - Arundhathi D
使用项目的第二个查询时出错,错误信息如下:groovysh_evaluate类中没有名为valug的属性。 是否显示堆栈跟踪?[yN] project('out', 'in')。 - Arundhathi D

0

我的建议与Stephen的相似,但也包括边缘或整个路径(我猜Cypher查询也返回了边缘)。

g.V().as("dest").outE().inV().as("cust").
  group().by(select("dest","cust")).by(path().fold()).
  unfold().filter(select(values).count(local).is(gt(1))).
  select(values).unfold()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接