首页 文章

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

提问于
浏览
3

enter image description here

考虑上面的图表 . 我想要一个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 回答

  • 4

    你的图表似乎并不表示双向边缘是可能的,所以我会回答这个假设 . 这是一个简单的示例图 - 请考虑在未来的问题中加入一个,因为它比阅读问题的人更容易理解图片和文字说明,并开始编写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> <Vertex Pairs,Count> (或更确切地说 <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]]
    

    这种方法在整个图形上放弃了较大的内存需求,而有利于在 by() (或基本上每个初始顶点处理)的末尾构建一个更小的 Map 个体 Vertex .

  • 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()
    

相关问题