GSQL中合并【边点边】结果为一条边的问题

最近在用GSQL写一个简单的查询接口。数据模型如下,希望从起点Cust_A查出Cust_A-Trade->Cust_C的所有结果并返回。

在原先neo4j模型中,Trade是一条边,而在tiger中Trade关系被拆分成了两条边Trade_From,Trade_To以及一个点Trade_Event。

现在的问题是,我不清楚如何通过GSQL把tiger的查询结果映射成neo4j的模型格式。

也就是把两条边Trade_From,Trade_To和一个点Trade_Event映射成Cust_A与Cust_C之间的边Trade,并将点Trade_Event的属性赋给边Trade。

这个过程当然可以通过java或js重新组装json报文来实现,但java里需要用临时变量、MAP或LIST等数据结构和循环来实现,GSQL里我好像没有找到类似的方法。

尝试了一下元组和累加器,自定义TRADE_COMBINE元组,把Trade_From,Trade_To以及Trade_Event拼在一起。然后通过SetAccum<TRADE_COMBINE>累加,确实可以把查询结果组合成三元组的形式。

但累加器的问题在于,累加过程中只记录节点的ID,没有属性信息,但我需要在最终的结果中返回所有节点和边的完整属性信息。

上图是我理想中希望返回的报文结构,我定义了边集edgeSet和节点集nodeSet,用来存带完整属性信息的点和边结果。

%CD%BC1

上图是我修改查询语句实现的效果,这里面我重定义TRADE_COMBINE元组,使它的结构更接近边的结构。并给它赋了e_type,from_id,from_type,to_id,to_type等字段值。唯一的问题是,我没办法直接访问TRADE_COMBINE的attributes,也没要找到如何在元组中自定义一个叫attributes的MAP的方法。

有没有更好的方法可以实现,比如虚拟一条边?

两个附加问题:

1.GSQL里好像没有提供自定义一个对象的数据类型,因此对返回结果的拼装不太方便;

2.点和边的完整信息只有select语句返回的结果集里才能取到,而且当需要复制点或边的attributes时,只能一条一条复制,没办法一次复制完整的attributes对象。

以上疑问,麻烦解答,谢谢!

举一个例子来实现类似的功能

schema:

schema

实现的脚本:

输出:

虚拟边是一个很好的建议,但是我们目前没有这样的功能,如果有更多的客户需要,我们增加这个的功能。

附加问题:

  1. 目前还不支持自定义的数据类型
  2. 用以下方法可以让收集后的SetAccum<Vertex>可以显示顶点的属性
实现的脚本:

query_example

输出:

1赞

不支持自定义的数据类型这点非常奇怪。GroupByAccum 能起到类似的功能,然而神奇的是不能返回

@wyx 具有这样的自定义类型 https://docs.tigergraph.com/dev/gsql-ref/querying/data-types#tuple 不知道能满足需求不,然后说到GroupByAccum不能返回,指的是return还是print