【问题标题】:gremlin query to retrieve vertices which are having multiple edges between themgremlin 查询以检索在它们之间具有多个边的顶点
【发布时间】:2017-11-03 11:25:52
【问题描述】:

考虑上图。我想要一个 gremlin 查询,它返回所有在它们之间有多个边的节点,如图所示。

此图是使用 neo4j 密码查询获得的: 匹配 (d:dest)-[r]-(n:cust) 与 d,n, count(r) 一样受欢迎 返回 d, n ORDER BY popular desc LIMIT 5

例如:RITUPRAKA... 和 Asia 之间有 8 条多重边,因此查询返回了 2 个节点以及边,其他节点也类似。

注意:图中还有其他节点,它们之间只有一条边,这些节点不会被返回。

我想要 gremlin 中的相同内容。

我使用了以下查询 gV().as('out').out().as('in').select('out','in').groupCount().unfold().filter(select(values).is( gt(1))).select(键)

正在显示 出:v[1234],入:v[3456] .....

但我不想显示节点的 ID,而是显示节点的值 比如输出:ICIC1234,输入: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 之类的错误,要遍历的每个顶点都使用索引进行快速迭代

【问题讨论】:

    标签: java groovy neo4j titan gremlin


    【解决方案1】:

    我的建议类似于 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()
    

    【讨论】:

      【解决方案2】:

      您的图表似乎没有表明双向边是可能的,所以我将在回答时考虑到这个假设。这是一个简单的示例图 - 请考虑在未来的问题中添加一个,因为它比图片和文字描述更容易让阅读您的问题的人理解并开始编写 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) 删除了“计数”,因为不再需要它(即我们只需要保存结果的顶点对的键)。

      也许另一种方法是使用这种方法:

      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()(或基本上每个初始顶点处理)。

      【讨论】:

      • 您能告诉我查询中值和键的定义位置吗?当我尝试您给出的第一个查询时,它显示以下错误 gV().as('out').out().as('in').select('out','in').groupCount() .unfold().filter(select(values).is(2)).select(keys) 没有这样的属性:类的值:groovysh_evaluate
      • 对于使用项目的第二个查询,得到如下错误没有这样的属性:类的值:groovysh_evaluate 显示堆栈跟踪? [yN] 项目('out','in')。
      猜你喜欢
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 2021-10-11
      • 2021-12-07
      • 2019-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多