java gremlin查询以检索在顶点之间具有多条边的顶点
考虑上面的图表。我想要一个gremlin查询,返回所有在它们之间有多条边的节点,如图所示
此图是使用neo4j cypher查询获得的: 匹配(d:dest)-[r]-(n:cust) d,n,count(r)为常用 返回d,n 按流行描述限制订购5
例如: 在里图普拉卡之间。。。和Asia有8条多条边,因此查询返回了2个节点和边,与其他节点类似
注意:图中的其他节点之间只有一条边,这些节点将不会返回
我想在《小精灵》中做同样的事情
我使用了下面给出的查询 g、 V()。as('out')。out()。as('in')。选择('out','in')。groupCount()。展开()。过滤器(选择(值)。is(gt(1)))。选择(关键点)
它正在显示 out:v[1234],in:v[3456]强>
但是我不想显示节点的ID,而是想显示节点的值 喜欢out:ICIC1234,喜欢in:HDFC234
我已将查询修改为 g、 V()。值(“名称”)。as('out')。out()。as('in')。值(“名称”)。选择('out','in')。 groupCount()。展开()。过滤器(选择(值)。is(gt(1)))。选择(键)
但它显示了类似classcastException的错误,每个要遍历的顶点都使用索引进行快速迭代
# 1 楼答案
我的建议与Stephen的类似,但也包括边,或者更确切地说是整个路径(我猜Cypher查询也返回了边)
# 2 楼答案
你们的图表似乎并没有表明双向边是可能的,所以我将在脑海中用这个假设来回答。这里有一个简单的示例图-请考虑一个关于未来的问题,因为它使它比图片和文本描述更容易阅读你的问题理解,并开始写一个GRMLIN遍历来帮助你:
所以你可以看到顶点a有两条到b的边,一条到c的边,所以我们应该得到a和b的顶点对。一种方法是:
上述遍历使用
groupCount()
来计算“out”和“in”标记顶点出现的次数(即它们之间的边数)。它使用unfold()
在<Vertex Pairs,Count>
(或更确切地说<List<Vertex>,Long>
)的Map
中迭代,并过滤掉计数大于1的那些(即多条边)。最后的select(keys)
删除“计数”,因为不再需要它(即,我们只需要保存结果顶点对的关键点)也许另一种方法是使用这种方法:
使用
project()
的这种方法放弃了对整个图上的大groupCount()
的更大内存需求,而是在单个Vertex
上构建一个更小的Map
,该Vertex
在by()
结束时(或者基本上是每个处理的初始顶点)有资格进行垃圾收集