【问题标题】:gremlin intersection with `select` and `as`gremlin 与 `select` 和 `as` 的交集
【发布时间】:2021-09-28 22:28:51
【问题描述】:

我正在跟进这两个问题 --

gremlin intersection operation

JanusGraph Gremlin graph traversal with `as` and `select` provides unexpected result

我正在集中查看 StackOverflow(想感谢社区!)但不幸的是我没有发布/写很多东西,所以我什至没有足够的声誉来发表评论上面的帖子...所以我在这里问我的问题..

在上面的第二篇文章中,Hieu 和我一起工作,我想提供更多关于这个问题的背景信息。

正如斯蒂芬在评论中所问(对于第二篇文章),我想在中间链接V() 的原因仅仅是因为我想从头开始遍历,即整个图的每个节点就像 g.V() 所做的一样,它出现在 gremlin documentation 中大多数查询的开头。

多一点说明:假设我需要对结果进行 2 个条件过滤器。基本上我想写

g.V().(Condition-A).as('setA')
 .V().(Condition-B).as('setB')
 select('setA').
 where('setA',eq('setB'))

它借用了斯蒂芬在第一篇文章中的回答的最后一个答案。这里Condition-ACondition-B 只是不同过滤步骤的链接,例如hashasLabel 等。

中间.V()的地方应该写什么?或者有没有其他方法可以编写查询,使Condition-B 完全独立于Condition-A

最后,我在https://tinkerpop.apache.org/docs/3.5.0/reference/#graph-step 的查询中间阅读了链接V() 的部分。我仍然无法完全理解第二篇文章的奇怪后果,也许我应该阅读更多关于遍历器如何工作的内容?

再次感谢 Kelvin 和 Stephen。很高兴也很高兴能与为 gremlin 写书/编写源代码的您联系。

【问题讨论】:

    标签: gremlin tinkerpop janusgraph


    【解决方案1】:

    在遍历过程中,V() 被应用到前面步骤创建的每个遍历器上。考虑使用航线数据集的这个例子:

    g.V(1,2,3)
    

    这将产生三个结果:

    v[1]
    v[2]
    v[3]
    

    如果我们计算图中的所有顶点:

    gremlin> g.V().count()
    ==>3747 
    

    我们得到 3,747 个结果。如果我们现在这样做:

    gremlin> g.V(1,2,3).V().count()
    ==>11241
    

    我们得到 11,241 个结果(正好是 3747 的 3 倍)。这是因为对于来自 g.V(1,2,3) 的每个结果,我们计算了图中的每个顶点。

    编辑添加:

    如果您需要聚合一些结果,然后使用这些结果作为过滤器再次浏览图表,一种方法是引入fold 步骤。这会将所有遍历器再次折叠成一个。这可确保第二个V 步骤不会被任何先前的扇出重复多次。

    gremlin> g.V(1,2,3).fold().as('a').V().where(within('a'))
    ==>v[1]
    ==>v[2]
    ==>v[3]
    
    gremlin> g.V(1,2,3).fold().as('a').V().where(without('a')).limit(5)
    ==>v[0]
    ==>v[4]
    ==>v[5]
    ==>v[6]
    ==>v[7]    
    

    再次编辑添加:

    我认为人们有时会纠结的关键部分是 Gremlin 遍历的流程。您可以将查询视为包含/产生一个或多个并行流(它可能不会以这种方式执行,但从概念上讲它有助于我以这种方式思考它)。所以g.V('1') 创建了一个流(我们通常将它们称为遍历器)。但是,如果有多个来自 V('1') 的传出边,g.V('1').out() 可能会创建多个遍历器。当遇到fold 时,所有遍历器都会重新折叠成一个。

    【讨论】:

    • 感谢 Kelvin,这让我明白了很多事情。
    • 谢谢凯文。如果我想在as('setA')(在我的原始帖子中)之后从头开始遍历(即整个图的每个节点,就像 g.V() 所做的那样,独立于Condition-A)构造Condition-B,我应该在查询中间的.V() 处写什么?有办法吗?
    • 刚刚也编辑了我原来的问题。看起来我的编辑历史有像 Github 这样的行差异,不知道你们是否能看到它……也修复了一些重要的错字。
    • 在我上面的回答中,我使用了fold 来“准备”第二个V()fold 将遍历再次变平,因此第二个 V() 不会重复多次。
    • 我认为您正在努力解决的关键部分是 Gremlin 遍历的流程。您可以将查询视为包含一个或多个并行流(它可能不会以这种方式执行,但从概念上讲它有助于我以这种方式思考它)。所以g.V('1') 创建了一个流(我们通常将它们称为遍历器)。但是g.V('1').out() 可能会创建多个遍历器,如果有多个传出边。当遇到fold 时,它们都会重新折叠成一个。我也会将此添加到答案中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    相关资源
    最近更新 更多