有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java gremlin查询以检索在顶点之间具有多条边的顶点

enter image description here

考虑上面的图表。我想要一个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的错误,每个要遍历的顶点都使用索引进行快速迭代


共 (2) 个答案

  1. # 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. # 2 楼答案

    你们的图表似乎并没有表明双向边是可能的,所以我将在脑海中用这个假设来回答。这里有一个简单的示例图-请考虑一个关于未来的问题,因为它使它比图片和文本描述更容易阅读你的问题理解,并开始写一个GRMLIN遍历来帮助你:

    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>(或更确切地说<List<Vertex>,Long>)的Map中迭代,并过滤掉计数大于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,该Vertexby()结束时(或者基本上是每个处理的初始顶点)有资格进行垃圾收集