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
相关产品推荐
相关产品推荐

