You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TinkerPop:基于边数筛选创建2个软件的人员(查询过滤失效)

搞定TinkerPop Modern里找创建2个软件人员的问题

看你已经写出能统计各人员创建软件数量的查询,结果也对,但加过滤条件就出问题了对吧?其实问题出在过滤的方式,还有原查询的遍历逻辑可以简化不少,我来帮你捋清楚:

先上直接能用的正确查询

第一种方式,用project先组装人员名称和创建数量,再过滤:

g.V().hasLabel("Person")
  .project("person", "createdCount")
    .by("name")
    .by(out("created").count())
  .where(select("createdCount").is(eq(2)))

第二种方式,基于你原来的group思路,调整过滤步骤:

g.V().hasLabel("Person")
  .group()
    .by("name")
    .by(out("created").count())
  .unfold()
  .where(select(values).is(eq(2)))
  .select(keys)

说说你原来的查询为啥麻烦

你用了repeat+emit来遍历,其实在TinkerPop Modern里,Person和Software之间是直接的created边,直接用out("created")就能拿到用户创建的所有软件,完全没必要用repeat——repeat是用来处理不知道深度的遍历场景(比如找N度关联的节点),这里深度固定是1,反而把逻辑搞复杂了,后续加过滤也容易踩坑。

要是你想基于自己原来的查询改,其实在最后加几步就行:

g.V().hasLabel("Person").as("from" ,"to1" ) 
  .repeat(bothE().as("e1").otherV().as("to1").dedup("from", "to1")).times(1) 
  .emit(filter(hasLabel("Software"))).hasLabel("Software") 
  .group().by(select("from").by("name")).by(count()).as("c")
  .unfold() // 把group的键值对展开
  .where(select(values).is(eq(2))) // 过滤数量等于2的
  .select(keys) // 只取人员名称

不过还是建议用前面简化的版本,更清晰高效。

结果验证

不管用哪种优化后的查询,最终都会输出Josh,这正是我们要找的创建了2个软件(Lop和Ripple)的人。

内容的提问来源于stack exchange,提问作者Srinath Ganesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:43:24