目前的场景:有两种不同类型的边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 18,446,744,073,709,551,615
收到,多谢
此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。