tigergraph中循环中的变量赋值为什么会被累加

WHILE innode.size() > 0 limit 5 DO
  innode = select t from innode:s -(<teninvmerge:e)- :t
    ACCUM
      @@links += e,
      s.@isEndNode += false,
      t.@receive += s.@send * e.conprop
    POST-ACCUM
      @@nodes += t,
      t.@cgzb += t.@receive,
      t.@send = t.@receive,
      t.@receive = 0;

    print innode;
END;

以上gsql查询出来的innode值, 在每次循环完成都会累加到之前的结果中。

您能就结果,举个例子吗?具体累加指什么样的情况?

比如上图,以A点查询起点进行5轮的入度的查询
期待结果
第一轮:起始节点:A 查询出节点:B,C
第二轮:起始节点:B,C 查询出节点:C,D
第三轮:起始节点:C,D 查询出节点:D,E
第四轮:起始节点:D,E 查询出节点:E,F
第五轮:起始节点:E,F 查询出节点:F

目前结果:
第一轮:起始节点:A 查询出节点:B,C
第二轮:起始节点:B,C 查询出节点:B, C,D
第三轮:起始节点:B, C,D 查询出节点:B, C,D, E
第四轮:起始节点:B, C,D, E 查询出节点:B, C,D, E, F
第五轮:起始节点:B, C,D, E, F 查询出节点:B, C,D, E, F

	WHILE innode.size() > 0 limit 5 DO
	
	  innode = select t from innode:s -(<teninvmerge:e)- :t
	    ACCUM
	      @@links += e,
	      s.@isEndNode += false,
	      t.@receive += s.@send * e.conprop
	    POST-ACCUM
	      @@nodes += t,
	      t.@cgzb += t.@receive,
	      t.@send = t.@receive,
	      t.@receive = 0;
	
	    print innode;
	END;

针对于以上的gsql, innode并没有被上一次查询结果覆盖, 而是不断做累加,结果导致重复计算的问题

请检查一下数据中,有没有B->B的情况。
我们测试了一下,在没有B->B的情况,是符合预期的。

一般在不确定数据中是否有环的情况,为了安全起见,我们会加一个OrAccum用来标记是否已经访问过,下次访问时,不再访问那些已经访问过的顶点。

下面举个例子,其中的@visited即是用来标记是否已经访问的OrAccum。

CREATE QUERY test_query(VERTEX<Step> source, 
                        int max_step_num) FOR GRAPH demo_graph{
  SetAccum<Edge> @@EdgeSet;
  OrAccum @visited;

  ##### Initialization  #####
  Steps = {source};

  ##### Find steps  #####
  WHILE(Steps.size() > 0) LIMIT max_step_num DO
    Steps = SELECT t
            FROM   Steps:s -(Step_NextStep:e)-> Step:t
	        WHERE  t.@visited == False #只访问那些未访问过的顶点
	        ACCUM  @@EdgeSet += e,
      	           t.@visited += True #给已访问的顶点做标记
    ;
  END;

  ##### Print result  #####
  PRINT @@EdgeSet;
}

我们的数据上没有环形,我不使用循环,而是5次顺序执行是没有这个问题的
是不是和版本或者配置有关系
目前我们使用的版本是: 2.4.0

可以把完整的GSQL内容发出来吗,包括create的语句,是用的instal query还是用INTERPRET QUERY?

CREATE QUERY getInvSubGraphByLayer(VERTEX<ent> entid) FOR GRAPH relation  SYNTAX("v2"){ 
  
	SetAccum<VERTEX> @@nodes;
	SetAccum<EDGE> @@links;
	SumAccum<DOUBLE> @cgzb, @send, @receive;
	AndAccum @isEndNode;
	SetAccum<VERTEX> @@innodePalceHolder;
	
	inputNode = {entid};
	inp = SELECT s from inputNode:s ACCUM s.@send  = 1, @@innodePalceHolder += inputNode;
	innode = @@innodePalceHolder;
	
  print innode; 
	
	WHILE innode.size() > 0 limit 5 DO
	
	  innode = select t from innode:s -(<teninvmerge:e)- :t
	    ACCUM
	      @@links += e,
	      s.@isEndNode += false,
	      t.@receive += s.@send * e.conprop
	    POST-ACCUM
	      @@nodes += t,
	      t.@cgzb += t.@receive,
	      t.@send = t.@receive,
	      t.@receive = 0;
	
	    print innode;
	END;
	nodes = @@nodes;
	print innode;
  PRINT nodes, @@links; 
	
}

使用的页面上编辑的, 不太清楚具体使用的是哪一种query

谢谢您的反馈,我会将这个问题提给我们的开发同事,请他们跟踪一下这个问题的。

1 个赞

您好!
根据开发同事的回应,该问题将在3.0.0版本修复,再次感谢您的反馈!

@ xuanlei.lin
想问下,下个版本就是3.0.0了吗?2.5跳到3.0。

没错,按目前的计划,2.5后会出3.0