gremlin 查询以检索在它们之间具有多条边的顶点
gremlin query to retrieve vertices which are having multiple edges between them
考虑上图。我想要一个 gremlin 查询 returns 所有节点之间有多个边,如图所示。
此图是使用 neo4j 密码查询获得的:
MATCH (d:dest)-[r]-(n:cust)
WITH d,n, count(r) 作为流行
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)
但是报classcastException之类的错误,要遍历的每个顶点都使用索引进行快速迭代
你的图表似乎没有表明双向边是可能的,所以我会考虑到这个假设来回答。这是一个简单的示例图表 - 请考虑包括一个关于未来问题的图表,因为它比图片和文字描述更容易让那些阅读你的问题的人理解并开始编写 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()
的较重内存要求,转而在单个 Vertex
上构建较小的 Map
在 by()
结束时(或基本上每个初始顶点处理)有资格进行垃圾收集。
我的建议与 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()
考虑上图。我想要一个 gremlin 查询 returns 所有节点之间有多个边,如图所示。
此图是使用 neo4j 密码查询获得的: MATCH (d:dest)-[r]-(n:cust) WITH d,n, count(r) 作为流行 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)
但是报classcastException之类的错误,要遍历的每个顶点都使用索引进行快速迭代
你的图表似乎没有表明双向边是可能的,所以我会考虑到这个假设来回答。这是一个简单的示例图表 - 请考虑包括一个关于未来问题的图表,因为它比图片和文字描述更容易让那些阅读你的问题的人理解并开始编写 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()
的较重内存要求,转而在单个 Vertex
上构建较小的 Map
在 by()
结束时(或基本上每个初始顶点处理)有资格进行垃圾收集。
我的建议与 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()