Aru*_*i D 3 java groovy neo4j gremlin titan
考虑上图。我想要一个 gremlin 查询,它返回所有节点之间具有多个边的节点,如图所示。
该图是使用 Neo4j 密码查询获得的: MATCH (d:dest)-[r]-(n:cust) WITH d,n, count(r) as pop RETURN d, n ORDER BY common desc LIMIT 5
例如: 在RITUPRAKA... 和 Asia之间有 8 个多重边,因此查询返回了 2 个节点以及边,与其他节点类似。
注意:图中还有其他节点,它们之间只有一条边,这些节点将不会被返回。
我想在gremlin中做同样的事情。
我使用了下面给出的查询 gV().as('out').out().as('in').select('out','in').groupCount().unfold().filter(select (值).is(gt(1))).select(键)
它显示 out:v[1234],in:v[3456] .....
但我不想显示节点的 ID,而是想显示节点的值,例如 out:ICIC1234,in:HDFC234
我已将查询修改为 gV().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()
Run Code Online (Sandbox Code Playgroud)
所以你可以看到顶点“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]]
Run Code Online (Sandbox Code Playgroud)
上面的遍历用于groupCount()计算“out”和“in”标记的顶点出现的次数(即它们之间的边数)。它用于unfold()迭代Mapof <Vertex Pairs,Count>(或更确切地说<List<Vertex>,Long>)并过滤掉那些计数大于 1 的内容(即多个边)。最终的结果select(keys)会删除“计数”,因为不再需要它(即我们只需要保存结果的顶点对的键)。
也许另一种方法是使用这种方法:
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]]
Run Code Online (Sandbox Code Playgroud)
这种方法project()放弃了整个图上的大图的较重的内存需求groupCount(),有利于构建一个较小的图,Map该图Vertex在结束时by()(或基本上每个处理的初始顶点)有资格进行垃圾收集。
| 归档时间: |
|
| 查看次数: |
4634 次 |
| 最近记录: |