【问题标题】:Why is this query timing out?为什么这个查询超时?
【发布时间】:2019-01-15 23:55:02
【问题描述】:

我正在尝试更新一个顶点及其所有子节点。我不确定它为什么会超时。

v = g.V().has('a', 'id', '1').next()"
"v.property('status', '0')"
"g.V(v).out('e').repeat(property('status', '0'))"

【问题讨论】:

    标签: graph cassandra datastax gremlin


    【解决方案1】:

    我假设您想用“0”的“状态”更新顶点及其所有子节点,如果是这样,那么您只需要这样做:

    g.V().has('a','id','1')
      property('status','0').
      repeat(out('e').property('status','0'))
    

    至于为什么它可能会超时,您可能会更仔细地查看您的数据,看看您是否在某个地方有一个循环(即,一个孩子是否以某种方式指向祖先?)。我还会考虑用until()times() 设置一个限制,看看你是否能找出遍历的深度。

    【讨论】:

    • 看起来超时是因为我的查询。一旦我更新到你所拥有的,它就不再超时了。我想知道为什么会这样。
    • 好吧 - 我猜g.V().repeat(__()) 从技术上讲是一个无限循环 - 你在遍历中有点像你只是在无休止地更新同一个顶点上的属性。
    • 我在顶点/孩子上调用重复,对吗?为什么会是一个无限循环? g.V(v).out('e') 会给我一个我可以调用重复的孩子列表?
    • 不 - 您不会只遍历“id”为“1”的第一个顶点的子节点。原始遍历循环中的唯一部分是对 property() 的调用,因此第一个子顶点命中 repeat() 并无休止地更新该顶点上的“状态”属性,并且因为 property() 只是返回相同的顶点一次又一次地送回repeat()循环。
    • 请注意我是如何将out('e') 移动到repeat() 中的——这是最大的不同。 repeat() 在遍历到最后一个孩子并且循环结束后,实际上已经没有地方可去。 g.V().repeat(sideEffect{println(it.get().id() + " " + it.loops)}) 与 TinkerGraph 会很容易地向您展示无限循环。
    猜你喜欢
    • 2011-03-24
    • 1970-01-01
    • 2011-03-11
    • 2011-08-27
    • 2020-03-19
    • 2014-03-12
    • 2011-02-28
    相关资源
    最近更新 更多