考虑上面的图表 . 我想要一个gremlin查询,它返回所有在它们之间有多条边的节点,如图所示 .
this graph was obtained using neo4j cypher query: MATCH (d:dest)-[r]-(n:cust) WITH d,n, count(r) as popular RETURN d, n ORDER BY popular desc LIMIT 5
在 RITUPRAKA... and Asia 之间 RITUPRAKA... and Asia 有8个多边,因此查询返回了2个节点以及边,类似于其他节点 .
Note: 图形中有其他节点,它们之间只有一条边,这些节点不会被返回 .
我想在 gremlin 中做同样的事情 .
I have used given below query gV() . as('out') . out() . as('in').select('out','in') . groupCount() . unfold() . filter(select(values).is(gt(1))) . 选择(键)
it is displaying out:v[1234],in:v[3456] .....
but instead of displaying Ids of the node I want to display values of the node like out:ICIC1234,in:HDFC234
I have modified query as g.V().values("name").as('out').out().as('in').values("name").select('out','in'). groupCount().unfold().filter(select(values).is(gt(1))).select(keys)
但是它显示了像classcastException这样的错误,每个要遍历的顶点都使用索引进行快速迭代
2 回答
你的图表似乎并不表示双向边缘是可能的,所以我会回答这个假设 . 这是一个简单的示例图 - 请考虑在未来的问题中加入一个,因为它比阅读问题的人更容易理解图片和文字说明,并开始编写Gremlin遍历来帮助您:
所以你可以看到顶点“a”有两个输出边到“b”,一个输出边到“c”,因此我们应该得到“a b”顶点对 . 获得这个的一种方法是:
上述遍历使用
groupCount()
来计算"out"和"in"标记顶点显示的次数(即它们之间的边数) . 它使用unfold()
迭代<Vertex Pairs,Count>
<Vertex Pairs,Count>
(或更确切地说<List<Vertex>,Long>
)并过滤掉计数大于1的那些(即多个边缘) . 最终select(keys)
因为不再需要而丢弃了"count"(即我们只需要保存结果的顶点对的键) .也许另一种方法是使用这种方法:
这种方法在整个图形上放弃了较大的内存需求,而有利于在
by()
(或基本上每个初始顶点处理)的末尾构建一个更小的Map
个体Vertex
.我的建议类似于Stephen的,但也包括边缘或整个路径(我猜Cypher查询也返回了边缘) .