多条边能不能按条件进行聚合,rank可以自增吗

目前的场景:有两种不同类型的边type1,type2 ,每个节点之间都会出现N多条type1的边,N多条type2的边,每条边里面都有一个数值类型的属性"total"。我现在的需求是画出所有点之间的关系图,但是两个点之间只能画一条线,这条线的信息需要包含tyep1、type2类型的边各有多少条,total属性的总值是多少,这个场景能通过一个nGQL语句查询出来吗

你是希望聚合做到内核里吗?有没有考虑做到业务层面可视化产品会比较好?

你意思是我把所有边都查出来 然后再聚合吗?量非常大。

可以用sum()和count()函数

假设数据是这样:

INSERT EDGE follow (degree) VALUES "player100"->"player101"@1:(10);
INSERT EDGE follow (degree) VALUES "player100"->"player101"@2:(20);
INSERT EDGE serve (start_year, end_year) VALUES "player100"->"player101"@2:(2000,2001);
INSERT EDGE serve (start_year, end_year) VALUES "player100"->"player101"@1:(2000,2001);


(root@nebula) [basketballplayer]> match (v)-[e:follow|:serve]->() where id(v) == "player100" return e
+-------------------------------------------------------------------------+
| e                                                                       |
+-------------------------------------------------------------------------+
| [:serve "player100"->"team204" @0 {end_year: 2016, start_year: 1997}]   |
| [:follow "player100"->"player101" @0 {degree: 95}]                      |
| [:follow "player100"->"player101" @1 {degree: 10}]                      |
| [:follow "player100"->"player101" @2 {degree: 20}]                      |
| [:serve "player100"->"player101" @1 {end_year: 2001, start_year: 2000}] |
| [:serve "player100"->"player101" @2 {end_year: 2001, start_year: 2000}] |
| [:follow "player100"->"player125" @0 {degree: 95}]                      |
+-------------------------------------------------------------------------+

可以这么写

match (v)-[e:follow|:serve]->() where id(v) == "player100” \
   return distinct {src(e), dst(e), type(e)}, count(*)
(root@nebula) [basketballplayer]> match (v)-[e:follow|:serve]->() where id(v) == "player100" return distinct {src(e), dst(e), type(e)}, count(*)
+--------------------------------------+----------+
| {src(e),dst(e),type(e)}              | count(*) |
+--------------------------------------+----------+
| {"follow", "player125", "player100"} | 1        |
| {"serve", "player101", "player100"}  | 2        |
| {"serve", "team204", "player100"}    | 1        |
| {"follow", "player101", "player100"} | 3        |
+--------------------------------------+----------+

或者

GO FROM "player100" OVER * \
   YIELD [type(edge), dst(edge)] as e | \
   GROUP BY $-.e YIELD $-.e AS e, count(*) as count
(root@nebula) [basketballplayer]> go from "player100" over * yield [type(edge), dst(edge)] as e | GROUP BY $-.e YIELD $-.e AS e, count(*) as count
+-------------------------+-------+
| e                       | count |
+-------------------------+-------+
| ["follow", "player101"] | 3     |
| ["serve", "team204"]    | 1     |
| ["follow", "player125"] | 1     |
| ["serve", "player101"]  | 2     |
+-------------------------+-------+
Got 4 rows (time spent 1435/129802 us)

1 个赞

好的
另外再问一个问题
边的rank 值有限制吗,目前22位的数字 写入的时候报错,19位的是可以的

rank 固定 8 byte [0],无符号,确实不能超过 20 位 [1]

Ref:

[0]

source: https://nebula-graph.com.cn/posts/nebula-graph-storage-engine-overview/

[1]

Size Signed Values Unsigned Values
1-byte -128 to 127 0 to 255
2-byte -32,768 to 32,767 0 to 65,535
3-byte -8,388,608 to 8,388,607 0 to 16,777,215
4-byte -2,147,483,648 to 2,147,483,647 0 to 4,294,967,295
5-byte -549,755,813,888 to 549,755,813,887 0 to 1,099,511,627,775
6-byte -140,737,488,355,328 to 140,737,488,355,327 0 to 281,474,976,710,655
7-byte -36,028,797,018,963,968 to 36,028,797,018,963,967 0 to 72,057,594,037,927,935
8-byte -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 0 to :point_right:t2:18,446,744,073,709,551,615

https://hpccsystems.com/training/documentation/ecl-language-reference/html/INTEGER.html%23Integer_Value_Ranges

收到,多谢

此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。