• [技术干货] GQL图查询语言语法概览
    2024年4月,国际标准化组织(ISO)与国际电工委员会(IEC)共同发布了编号为ISO/IEC 39075:202的图查询语言标准 GQL(Graph Query Language),这是继 ISO 发布第一版 SQL 37年后第二个数据库查询语言标准。目前,国际关联数据基准委员会(Linked Data Benchmark Council,以下简称LDBC)官网上已经发布了GQL相关的语法解析工具和基于antlr的文法文件。预计在GQL的影响下,图厂商会加强对GQL的支持力度,开发者后续进行图分析会更加方便。笔者发现,目前网上对GQL相关语句的示例比较少,于是读了GQL标准文档,并试着写了一些符合GQL标准语法的语句,与大家分享。希望后面有越来越多的介绍GQL的相关文章,一方面让开发者了解图查询语言,进而了解图可以解决什么问题;另一方面,让图厂商了解GQL标准,推动GQL更快的普及。注1:本文涉及的所有GQL语句,都在cid:link_3 上解析通过。GQL除了语法规则,还存在一部分语义约束,部分语句符合语法规则,但可能会违反语义约束,请读者自行甄别。注2:本文只是GQL语法功能和应用场景探讨,不涉及某个特性在某个具体图产品上的具体实现讨论。GQL语法介绍本文集中对GQL的图管理、数据修改、数据查询、表达式这几部分给出语句示例,涵盖标准的12-20章的内容,每一部分会先尝试描述支持的特性,然后给出语句示例。下列特性本文只是部分涉及,不做重点描述:Session管理 (第7章)和事务(第8章)复杂引用类型和字面量(Literal)规则(17章、21章)语句返回状态和诊断(23章)Binding Variable Definition Block(第9章)图管理语句图管理语句描述集中在标准的第12章,GQL提供了对图SCHEMA管理、图管理和图上点边类型管理三部分内容。SCHEMA管理SCHEMA管理(GC01)允许一个图数据库实例创建一个或多个SCHEMA,一个SCHEMA下可以创建多个图,不同的SCHEMA实现资源的隔离,从语义上支持逻辑多租。创建一个图SCHEMA,使用下列语句:CREATE SCHEMA IF NOT EXISTS /catelog/one_schema_name其中if not exists是一个可选的语法(GC02)。删除图SCHEMA,使用下列语句:DROP SCHEMA IF EXISTS /catelog/one_schema_name图管理GQL同时兼容强类型图(Closed Graph Type,如GES)和弱类型图(Open Graph Type,如Neo4j),因此创图语句也同时支持两种类型的图。创图-弱类型图CREATE OR REPLACE GRAPH /catelog/one_schema_name/graph_name TYPED ANY 或者CREATE GRAPH /catelog/one_schema_name/graph_name ::ANY GQL中支持使用typed关键字或者::关键字指定类型。创图-强类型图CREATE GRAPH /catelog/one_schema_name/graph_name :: one_graph_type或者在创图语句定义类型(GG03):CREATE GRAPH graph_name TYPED graph { (customer:Customer => {id::STRING, name::STRING}), (account:Account => {no1 TYPED STRING, acct_type TYPED STRING }), (customer)-[:HOLDS]->(account), (account)-[:TRANSFER {amount::INTEGER}]->(account) }此外,还支持引用其他图类型(GG04),以及创图时拷贝其他图类型的数据:CREATE GRAPH graph_name LIKE another_graph AS COPY OF another_graph其中AS COPY OF another_graph是可选语法项(GG05),表示数据拷贝,而like关键字(GG04)是表示的图上点边类型信息的拷贝。删除图的逻辑比较简单,示例如下:DROP GRAPH IF NOT EXISTS /catelog/schema_name/graph_name其中IF NOT EXISTS是可选语法项(GC05)。Graph Type管理在GQL中,对于Closed Graph Type,提供了一套定义点边类型的能力。这里有三点值得关注:对点边类型,GQL认为点边的类型不一定等价于点边的Label(GG02),即在某些情况下,类型可以表示为一组label sets和一组属性的定义的集合。GQL对无向边提供了支持(GH02),通过波浪线可以定义某条类型的边是无向边。如果启用了特性GG26, 不同type下的同名属性,允许支持不同类型。一个典型的定义Graph Type的语句如:CREATE GRAPH TYPE IF NOT EXISTS one_graph_type AS { (account:Account => {no1::STRING, acct_type::STRING }), (account)-[:Transfer {amount::INTEGER}]->(account), (account)~[:Transfer2 {amount::INTEGER}]~(account) }这里Account和Transfer都是Label名。如果Account和Transfer是类型名,要这么写:CREATE GRAPH TYPE IF NOT EXISTS one_graph_type AS { NODE Account(account{id::STRING, acct_type::STRING }), DIRECTED EDGE Transfer{amount::INTEGER} CONNECTING (account -> account), UNDIRECTED EDGE Transfer2{amount::INTEGER} CONNECTING (account ~ account) }如果图中类型信息包含了一组label信息(如支持可选特性GG02的图),语句估计会这么写:CREATE GRAPH TYPE IF NOT EXISTS one_graph_type AS { NODE Account(account:AccountA&AccountB{id::STRING, acct_type::STRING }), DIRECTED EDGE Transfer:Transfer{amount::INTEGER} CONNECTING (account -> account), UNDIRECTED EDGE Transfer2:Transfer2{amount::INTEGER} CONNECTING (account ~ account) }此外,也支持拷贝其他的graph_type,如:CREATE GRAPH TYPE one_graph_type AS COPY OF graph_or_external_reference; CREATE GRAPH TYPE one_graph_type LIKE like_graph; CREATE OR REPLACE GRAPH TYPE one_graph_type LIKE like_graph; 删除Graph Type语法比较简单:DROP GRAPH TYPE IF EXISTS /catelog/one_graph_type数据修改语句数据修改语句集中在第13章,和Cypher差异不大,这里只给出示例,不做过多描述。// insert USE graph_name INSERT (n:SomeLabel{prop1:'value1'}) INSERT (n:Account)-[r:Transfer{amount:10}]->(m:Account) // set MATCH (n:LabelA) WHERE element_id(n)='' SET n.prop='value1', n:LabelA, n = {p1:'v1',p2:'v2'} // remove MATCH (n:LabelA) WHERE element_id(n)='' REMOVE n.prop, n:LabelA // delete MATCH p=(n)--(m) DELETE n,m MATCH p=(n)--(m) DELETE nodes(p) 官方文档中,还有delete subQuery的语义(GD03),因为之前没有类似的概念参考,所以这里不进行举例。数据查询语句在数据查询语句部分(第14章),GQL扩展了较多的能力,将文法文件读下来,感受有几点:支持语句像电路一样串并联形成执行流水线,支持临时结果集,以及更灵活的子查询逻辑支持多种路径模式,对查询意图的表达能力更强支持变长路径(Quantified paths)以及嵌套变长路径查询,对时序图比较友好支持SELECT关键字,使用SQL风格的文法查询图数据库在开始介绍之前,首先枚举一下GQL涉及的查询类子句,以及Cypher中类似语义的子句或者关键字,方便了解Cypher的同学快速入门。GQL子句Cypher子句备注matchmatch能力增强optionaloptionalGQL支持optional后跟子查询filter/wherewhere能力类似,区别在表达式的不同letwith能力类似forunwindGQL支持输出元素下标值order byorder byGQL支持自定义null值排序时优先级limit/offsetlimit/offset能力类似returnreturn能力类似, GQL支持显式的group by子句selectGQL独有的SQL风格的子句,语义上支持多图联合查询union/except/otherwise …union能力增强yieldyield能力类似语句流水线经常使用图查询来进行业务开发的同学可能会有这种需求,需要将同一个语句的结果(如Q1)作为输入同时给多条语句(如Q2和Q3),然后将Q2和Q3的结果进行进一步加工处理,GQL提供了类似的能力,可以将若干语句像电路一样进行串联和并联,形成流水线执行。其中关键字如下:并联:UNION(GQ03)OTHERWISE(GQ02)EXCEPT(GQ04,GQ05)INTERSECT(GQ07)串联:NEXT(GQ20)例如下面的语句中,通过next和except关键字,检索了某个person的好友喜欢评论的帖子,都分布在哪些标签下,其中这些帖子不包含person自己早于$date时间创作的帖子。MATCH (person)-[:KNOWS]->{2}(friend) WHERE element_id(n)=$personId RETURN person, friend NEXT YIELD person, friend MATCH (friend)<-[:HAS_CREATOR]-(comment:Comment)-[:REPLY_OF]->(post:Post) RETURN post EXCEPT ALL MATCH (person)<-[:HAS_CREATOR]-(post:Post) WHERE post.creationDate < $date0 RETURN post MEXT YIELD post MATCH (post)<-[:HAS_TAG]-(tag) RETURN tag.name, count(*) 虽然Cypher也能表达相同的语义,但是,要么子查询会写的很复杂,要么受限于语句文法,会有重复遍历或者数据膨胀的问题。从这一点上看,语句流水线这个特性,能大大缓解一部分Cypher做星型查询或者长链路查询时,由于查询路径上某一类点结果特别多,造成的数据膨胀以及反复遍历的问题。Match子句match子句GQL的描述,Neo4j官网已经介绍了很多内容。这里主要围绕四个特性进行介绍:遍历模式可变长路径路径拼接点边pattern和label过滤遍历模式GQL提供了match mode和path mode/search mode两类遍历模式,其中match mode只能写在每个match关键字后,path mode/search mode可以写在每条路径前,或者match语句后接的keep语句中,这里简要列一下文档中的语法规则。<simple match statement> ::= MATCH <graph pattern binding table> <graph pattern binding table> ::= <graph pattern> [ <graph pattern yield clause> ] <graph pattern yield clause> ::= YIELD <graph pattern yield item list> <graph pattern yield item> ::= <element variable reference> | <path variable reference> <graph pattern> ::= [ <match mode> ] <path pattern list> [ <keep clause> ] [ <graph pattern where clause> ] <path pattern list> ::= <path pattern> [ { <comma> <path pattern> }... ] <path pattern> ::= [ <path variable declaration> ] [ <path pattern prefix> ] <path pattern expression> 提炼其中关于遍历模式相关的语法规则,简化后大概为:<graph pattern> ::= [ <match mode> ] [ <path variable declaration> ] [ <path pattern prefix> ] <path pattern expression> [ { <comma> [ <path variable declaration> ] [ <path pattern prefix> ] <path pattern expression> }... ] [ KEEP <path pattern prefix> ] [ <graph pattern where clause> ] 其中关于match mode和path pattern prefix,有如下规则:<match mode> ::= <repeatable elements match mode> | <different edges match mode> <path pattern prefix> ::= <path mode prefix> | <path search prefix> <path mode prefix> ::= <path mode> [ <path or paths> ] <path mode> ::= WALK | TRAIL | SIMPLE | ACYCLIC <path search prefix> ::= <all path search> | <any path search> | <shortest path search> 关于Match Mode,可以看到起作用范围为整条match子句,有下列两种模式,根据模式名称可以大概猜出其含义:模式名称含义特性编号DIFFERENT EDGES要求match后同一条路径中不能含有相同的边G002REPEATABLE ELEMENTS允许路径中出现重复元素G003其中Note 220提到了当match mode为DIFFERENT EDGES时,似乎是对Match后跟的path pattern数量有约束,即如果路径中出现selective path pattern,则当match mode为DIFFERENT EDGES时,path pattern list中只能有这一条path pattern。这里给出match mode相关的例句:MATCH DIFFERENT EDGES (n)-[r]->(m),(m)-[r1]->(s) WHERE element_id(n)='1' RETURN count(*) MATCH REPEATABLE ELEMENTS (n)-[r]->(m),(m)-[r1]->(s) WHERE element_id(n)='1' RETURN count(*) 关于path mode四种模式,其含义在聊聊超级快的图上多跳过滤查询文章中已经提到过,这里不再赘述。至于path search prefix,可以用来约束查询数量以及是否优先返回最短路。下面给出这些模式相关的例句:编号特性描述例句G010Explicit WALK keywordMATCH p=WALK (n)<-[:HAS_CREATOR]-(:Comment)-[:REPLY_OF]->(s:Post) WHERE element_id(n)='1' RETURN pG011Advanced path modes: TRAILMATCH p=TRAIL (n)<-[:HAS_CREATOR]-(:Comment)-[:REPLY_OF]->(s:Post) WHERE element_id(n)='1' RETURN pG012Advanced path modes: SIMPLEMATCH p=SIMPLE (n)<-[:HAS_CREATOR]-(:Comment)-[:REPLY_OF]->(s:Post) WHERE element_id(n)='1' RETURN pG013Advanced path modes:ACYCLICMATCH p=ACYCLIC (n)<-[:HAS_CREATOR]-(:Comment)-[:REPLY_OF]->(s:Post) WHERE element_id(n)='1' RETURN pG015All path search: explicit ALL keyword”MATCH p=ALL WALK (n)<-[:HAS_CREATOR]-(:Comment)-[:REPLY_OF]->(s:Post) WHERE element_id(n)='1' RETURN pG016Any path searchMATCH p=ANY 5 TRAIL (n)<-[:HAS_CREATOR]-(:Comment)-[:REPLY_OF]->(s:Post) WHERE element_id(n)='1' RETURN pG017All shortest path searchMATCH p=ALL SHORTEST (n)<-[:HAS_CREATOR]-(:Comment)-[:REPLY_OF]->(s:Post) WHERE element_id(n)='1' RETURN pG018Any shortest path searchMATCH p=ANY SHORTEST (n)<-[:HAS_CREATOR]-(:Comment)-[:REPLY_OF]->(s:Post) WHERE element_id(n)='1' RETURN pG019Counted shortest path searchmatch p=SHORTEST 5 (n)<-[:HAS_CREATOR]-(:Comment)-[:REPLY_OF]->(s:Post) WHERE element_id(n)='1' RETURN pG020Counted shortest group searchmatch p=SHORTEST 5 GROUP (n)<-[:HAS_CREATOR]-(:Comment)-[:REPLY_OF]->(s:Post) WHERE element_id(n)='1' RETURN pG006Graph pattern KEEP clause: path mode prefixmatch p=(n)<-[:HAS_CREATOR]-(:Comment)-[:REPLY_OF]->(s:Post) KEEP WALK WHERE element_id(n)='1' RETURN pG007Graph pattern KEEP clause: path search prefixmatch p=(n)<-[:HAS_CREATOR]-(:Comment)-[:REPLY_OF]->(s:Post) KEEP ANY SHORTEST 5 WHERE element_id(n)='1' RETURN p这里有一个shortest group的概念(G020),其含义是将不同长度的路径分组,例如SHORTEST 3 GROUP就是将所有最短路、所有次短路以及除了最短路和次短路外的最短路返回,相关概念neo4j也解释的很好,可以参阅Neo4j - Shortest paths。可变长路径与Cypher不同,GQL提供可不一样的变长路径参数,相关例句Neo4j官网也有解释:编号特性名例句G035Quantified pathsMATCH (:Station {name: 'Peckham Rye'})-[link:LINK]-(:Station {name: 'Clapham Junction'}){1,3} return count(*)G036Quantified edgesMATCH (:Station {name: 'Peckham Rye'})-[link:LINK]-{1,3}(:Station {name: 'Clapham Junction'}) return count(*)这里{1,3}还可以替换成*,{3},+,?这样其他的表达方式,分别表示不限定跳数、固定跳数,至少1跳,存在性验证这样的场景。这种改写方式,对时序图会更友好,想象一个列车中转的场景,要查询两班列车能否接续中转,可以用下列的写法:MATCH (:Station)<-[:CALLS_AT]-(d:Stop) ((s:Stop)-[:NEXT0]->(f:Stop) WHERE s.time0 > f.time0){1,3} (a:Stop)-[:CALLS_AT]->(:Station) RETURN d.departs AS departureTime, a.arrives AS arrivalTime这里通过嵌套路径(G038)的where s.time0 > f.time0表达了路径上节点关系之间的强时序约束,可以用于微博转发分析、疫情传播分析等场景。在具体实现时,相关约束可以下推到遍历过程中。如果cypher要表达类似的语义,至少需要在所有路径产生后,使用ListComprehension语义和range枚举下标结合才能完成,且难以下沉到遍历过程中完成。此外match语句的相关规则中,对无向边匹配也有相关描述,这里举个例子:MATCH (a:Station)~[:CALLS_AT]~(d:Stop WHERE d.time0 > a.time0) RETURN d MATCH (a:Station)~[:CALLS_AT]~>(d:Stop WHERE d.time0 > a.time0) RETURN d MATCH (a:Station)<~[:CALLS_AT]~(d:Stop WHERE d.time0 > a.time0) RETURN d此外还有些路径简写的例子,笔者没有做深入分析,只写几条通过了parser的示例语句:编号特性名例句G047Relaxed topological consistency: concise edge patternsMATCH p=<-[:R]--[:S]- RETURN pG044Basic abbreviated edge patternsMATCH (a:Station)->(d:Stop) return d路径拼接GQL还支持对路径进行拼接,以及路径中使用|,以及|+|操作符,这里直接给例子:G030 Path multiset alternation:MATCH (p:Person)-[:LIVES_IN]->(c:City)|+|(p:Person)-[:LOCATED_IN]->(c:Place) RETURN pGQ032 Path pattern union:MATCH (p:Person)-[:LIVES_IN]->(c:City)|(p:Person)-[:LOCATED_IN]->(c:Place) RETURN p以及查询结果的路径拼接(GE06):match p=(a)->(b),p1=(b)->(d) return p||p1 match (a)-[r]->(b),(b)-[r1]->(d) return PATH[a,r,b,r1,d] 点边pattern和label过滤在GQL中,点边的属性过滤支持两种模式:特性名例句element pattern where clauseMATCH (a:Station)<-[:CALLS_AT]-(d:Stop where d.time0 > 1) RETURN delement property specificationMATCH (a:Station)<-[:CALLS_AT]-(d:Stop{time0:1}) RETURN d显然使用where表达过滤,能力会更为强大,当然,相关过滤条件也可以写在后面的where子句中。此外label支持若干复杂的与或非操作,示例如下:MATCH (a:Station|Stop) return a MATCH (a:Station&Stop) return a MATCH (a:(Station&Stop)|OtherLabel) return a match (a:%) return a这里%是wildcard label(G074), match (a:%) return a其含义是匹配有label的点,也就是在G074特性启用后,支持判断点上是否有label。let子句Let子句(GQ09)与cypher的with子句类似,这里只给一个示例:MATCH (n) LET gender = n.gender RETURN genderfor子句for子句与cypher的unwind类似,表示遍历某个可以遍历的结构,与unwind不同的是,for提供了一种类似于python中enumerate函数的用法,可以同时给出元素下标和索引值。在官方文档中也同步说明,for语句中可以嵌套一个临时表结构,这里试着给出示例:GQ10 FOR statement: list value supportMATCH (n:LabelA) WHERE n.age < 10 LET v=collect_list(n) FOR s IN v RETURN s GQ24 FOR statement: WITH OFFSETMATCH (n:LabelA) WHERE n.age < 10 LET v=collect_list(n) FOR s IN v WITH OFFSET index RETURN index, s GQ23 FOR statement: binding table supportTABLE userActivity = { MATCH (u:User)-[a:ACTION]->() RETURN u.id AS userId, a.ts AS timestamps } FOR u IN userActivity RETURN u.userId, u.timestampsGQ11 FOR statement: WITH ORDINALITYTABLE userActivity = { MATCH (u:User)-[a:ACTION]->() RETURN u.id AS userId, a.ts AS timestamps } FOR u IN userActivity WITH ORDINALITY index RETURN index,userId, timestamps排序和分页子句排序和分页相关语义与Cypher差异不大,GQL支持了排序时定义null的优先级(GA03),这里给出一个示例:MATCH (n) RETURN n.name AS name ORDER BY name ASC NULLS FIRST, n.date0 DESC NULLS LAST 也同步给一个limit和offset的示例:MATCH (n) RETURN n SKIP 10 LIMIT 10 return子句GQL的结果返回子句中,除了支持order by之外,还可以支持group by子句(GQ15),其他和Cypher差别不大,这里试着写一个sql风格的group by:MATCH (n) LET type0=n.type0, name = n.name RETURN count(*) GROUP BY type0select子句在GQL文档中,提供了SQL风格的select子句,但是奇怪的是,select子句是在focused linear query statement语法规则下,而如果GQL没用启用GQ01 Use grpah相关的规则,focused linear query statement不应出现在GQL语句中,也就是说,select子句的特性是一组可选特性,但是select也可以有不显式声明使用某个graph的写法。另一个奇怪的点在于,GQL提供了临时表的语法,但是select的语法规则中,其后必须跟一个match子句或者是嵌套子查询,而不能用来操作临时表,这就和SQL+Graph的设计理念有一些冲突。先来看select的具体规则:<select statement> ::= SELECT [ <set quantifier> ] { <asterisk> | <select item list> } [ <select statement body> [ <where clause> ] [ <group by clause> ] [ <having clause> ] [ <order by clause> ] [ <offset clause> ] [ <limit clause> ] ] <select item list> ::= <select item> [ { <comma> <select item> }... ] <select item> ::= <aggregating value expression> [ <select item alias> ] <select item alias> ::= AS <identifier> <having clause> ::= HAVING <search condition> <select statement body> ::= FROM { <select graph match list> | <select query specification> } <select graph match list> ::= <select graph match> [ { <comma> <select graph match> }... ] <select graph match> ::= <graph expression> <match statement> <select query specification> ::= <nested query specification> | <graph expression> <nested query specification> 这样很容易写出一条符合语法规则的语句:SELECT n.name AS name, n.age AS age FROM CURRENT_GRAPH MATCH (n:LabelA) WHERE n.score > 10 ORDER BY age OFFSET 10 LIMIT 10 但是如果用来操作临时表,就得这么写:TABLE userActivity = { MATCH (u:User)-[a:ACTION]->() RETURN u.id AS userId, a.ts AS timestamps } SELECT userId, ts FROM { FOR u IN userActivity RETURN u.userId AS userId, u.timestamps AS ts } where ts > 2 可以看到显得有些鸡肋,虽然下面的写法也能parse成功,但是总感觉少了些什么:TABLE userActivity = { MATCH (u:User)-[a:ACTION]->() RETURN u.id AS userId, a.ts AS timestamps } SELECT userId, ts FROM { FOR u IN userActivity } where ts > 2 此外select也能使用group by和having,这里给个例子,做例子时没有做到只在group by子句中出现group key,可能在具体语义上会有些问题:SELECT n.gender AS gender,count(*) AS count0 FROM CURRENT_GRAPH MATCH (n:LabelA) WHERE n.score > 10 GROUP BY gender having count0 > 10 表达式GQL的表达式主要在第20章,总体上继承了Cypher的风格,但是在一些表现形式上有差异。与Cypher相比,其做的好的点有:支持判断值的类型支持显示类型转换支持一系列值拼接语法,内置了丰富的谓词感觉缺失的点有:缺少访问列表下标相关语义(也可能是笔者没读到,毕竟collect_first函数、for子句都有了)缺少一些原生的、与返回格式相关的关键字(毕竟都有table、graph这样的显式值类型了)表达式就不展开描述了,只讲下做的好的几个点:值类型判断GQL中支持判断值类型(GA06),相关的类型有15种,这里给出14种类型判断的语句,至于判断某个类型是否为Graph,笔者实在是不知道怎么用GQL构造一个语义上很清晰的Graph对象,暂时不给出示例。类型关联特性编号示例语句BOOL/BOOLEANVALUE a = true RETURN a IS TYPED BOOL, a IS ::BOOLString/CHAR/VARCHARVALUE a = 'hello' RETURN a IS TYPED STRING, a IS ::VARCHARBYTES/BINARY/VARBINARYGV35VALUE v::BYTES=X'AFDEAA' RETURN v IS TYPED BYTES, v IS::VARBINARYNumericVALUE a = 1 RETURN a IS TYPED INT32, a IS ::INT64TemporalGV39VALUE a = date('2025-03-28') RETURN a IS ::DATEDurationGV41VALUE a = DURATION({hours:1, minutes:1,seconds:1}) RETURN a IS ::DURATION(YEAR TO MONTH), a IS ::DURATION(DAY TO SECOND)ImmaterialGV71,GV72VALUE a = null RETURN a IS ::NOTHING, a IS ::NULLNodeMATCH (n) RETURN n IS ::NODE, n IS ::VERTEXEdgeMATCH (n)-[r]->() RETURN r IS ::EDGE, r IS ::RELATIONSHIPPathGV55MATCH p=(a)->(b) RETURN p IS ::PATHListGV50VALUE a = [1,2,3,4] RETURN a IS ::LIST, a IS ::List<int>, a IS ::ARRAYRecordGV45VALUE s = {name:'s', age:10} RETURN s IS ::RECORD,s IS ::RECORD{name::STRING, age::INTEGER}Dynamic Union Type(GV67):VALUE a = 1 RETURN a is ::int|bool Binding Table Type(GV61,GE02):TABLE userActivity = { MATCH (u:User)-[a:ACTION]->() RETURN u.id AS userId, a.ts AS timestamps } RETURN userActivity IS ::BINDING Table{userId::INT, timestamps::TIMESTAMP}支持显示类型转换GQL支持下列语法,可以显示转换类型:RETURN CAST(1 as INT64) 支持一系列拼接语法,内置丰富的谓词GQL支持字符串、list和path等对象的拼接,如:RETURN "aaa"||"bbb" MATCH p=(a)->(b),p1=(b)->(d) RETURN p||p1 MATCH [1,2,3,4]||[5,6,7,8] 也内置了一系列丰富的谓词,如:MATCH (n)-[r]->(m) RETURN n IS SOURCE OF r,m IS DESTINATION OF r MATCH (n) WHERE n.id=1 LET a=n WHERE EXISTS{(a)-->()} RETURN a 其他资料和困惑除了上述介绍的语法特征,GQL还支持事务管理、session管理,语句状态和诊断,以及将子查询的结果绑定到某个表或者某个变量上(GQ18),这些后面再聊。有点疑惑的点在于,GQL支持表和图作为变量的类型,但是有下面的矛盾:文档中给出了定义临时表的语法,处理临时表的语法却很少(只有一个for语句)文档中给出了处理图的语法,但是没有给出定义一个临时图的语法也就是说文档里没有显示的标明,在Binding Variable Definition Block中,如何通过子查询来定义一个图,而不是表。虽然可以用value关键字将某个子查询绑定到图上,但是这种绑定依赖的是等号左边声明的图类型,而非语句本身结果就是一个图,例如下列语句能过GQL的解析器,但是却不一定有实际含义,等号右侧不一定是一个图,如果右侧可以是一个图,也是因为等号左侧声明了GRAPH userActivity:GRAPH userActivity = value { MATCH (u:User)-[a:ACTION]->() RETURN u,a } return userActivity 相反表的定义就很自然,毕竟处理结果总是能整理成一张表的,不过GQL中处理表的文法就有点鸡肋了,select后的from子句还无法直接跟表的名称。这块等后面有时间再讨论。在github OPENGQL 代码仓中,给出了GQL的文法,以及解析工具,还有railroad图,本文的所有示例都是在代码仓的GQL Editor中解析通过的,毕竟解析通过的,才至少"看起来是正确的”。另外,文中所有的GV45,GC02,G002这样的编号,都是GQL官方文档中可选特性的特性编号,可以直接对号入座方便了解和学习。参考文档:LDBC open-source GQL tools: https://ldbcouncil.org/pages/opengql-announce/ISO/IEC 39075:2024 Information technology — Database languages — GQL: https://www.iso.org/standard/76120.htmlNeo4j GQL conformance: https://neo4j.com/docs/cypher-manual/current/appendix/gql-conformance/Neo4j - Shortest paths: cid:link_1GQL overview: https://cloud.google.com/spanner/docs/reference/standard-sql/graph-introWhat is the database language GQL?: https://www.linkedin.com/posts/jtc1news_gql-database-language-standard-isoiec-39075-activity-7186398287963279360-E6rV?utm_source=share&utm_medium=member_desktopOpen GQL:cid:link_4
  • [问题求助] BUG求助
    在关系标签下,如rate标签,选择标签的属性进行画布展示,但却没有变化,而在其他节点标签中却可以实现,这是一个BUG吗,要如何解决。
  • [问题求助] 基于图数据库的OneID实现思路
    传统车企,公司想做B、C端用户数据的融合,基于OneID技术实现对用户的统一管理,有大侠在这方面做个探索吗?也就是说,基于图数据库如何实现OneID的存储和计算,以便更高效的对OneID进行算法升级等工作
  • [热门活动] 资讯|中国图数据库,领导者!
    近日 ,全球领先的IT市场研究和咨询公司IDC发布《IDC MarketScape: 中国图数据库市场厂商评估,2023》报告华为云GES(图引擎服务)凭借多年的技术积累和丰富的行业实践经验位居领导者类别IDC MarketScape报告中指出:“华为云GES作为拥有自主知识产权的国产分布式原生图数据库和图引擎产品,提供一站式的图存储、图查询和图计算能力,支持30+高性能算法,覆盖多场景分析计算,具备10+图神经网络和图嵌入算法。广泛应用于互联网、政务、安平、税务、电力等行业,为客户的辅助决策、降本增效等提供专业、高效的服务。”深耕技术,让GES应用更高效随着数字化转型的加速,企业的业务数据已经出现多源异构、关联复杂的特点,Graph(图)技术作为处理异构数据的技术应运而生。图数据分析平台将作为大数据、数仓的加持,成为企业数据分析的重要基础平台华为云GES集图数据库和图分析引擎一体化,具备完善的图分析、图查询、图可视化能力,作为中国首个商用的、拥有自主知识产权的原生图产品,具备以下几个优势:分析查询一体化一份数据做两件事:查询和分析一体化, 提供丰富的图分析算法,为关系分析、路径规划、精准营销等业务提供多样的分析能力;支持Cypher和Gremlin两种主流图查询语言,兼容客户的使用习惯;内置30+高性能算法,覆盖多场景分析计算,具备10+图神经网络和图嵌入算法大规模、高性能得益于高效的数据组织,华为云GES可以让客户有效地对百亿节点千亿边规模的数据进行查询和分析;深度优化的分布式图计算引擎,可以为客户提供高并发、秒级多跳的实时查询能力,查询和算法性能业界领先,6跳查询秒级响应。简单易用,支持no-code可视化分析华为云GES支持no-code图建模、实体的下钻、筛选展示以及算法调参等功能,可实现0代码完成图的构建和分析;除此之外,它还提供0门槛创建和使用图的功能,还可以针对部分场景,支持built-in操作,即开即用。合作共赢,让GES应用更全面依托于强大的科研能力,华为云GES已经在政务、金融、互联网等多个行业实践并取得明显应用效果,并已服务超过50家客户。可广泛应用于社交关系分析、营销推荐、数据血缘、信息传播、团伙挖掘、金融风控、工业互联网等具有丰富关系数据的场景。政务行业多地政府部门早已实现“数字化”办公,但是原有平台无法及时处理海量、复杂的业务诉求。以某市12345热线为例,平均一个月需要处理60多万单市民诉求,热线响应速度慢,工单处置能力有限。通过和华为云GES合作,借助大数据AI手段使得工单处理效率提升60%,热线接通率提升20%,市民满意度提升至87%,大大提升了政府服务水平。金融行业随着金融数字化进程,电子支付已是大势所趋,但同时也存在薅羊毛、恶意套现等欺诈手段,如何在海量数据中甄别异常用卡、异常套现,已是金融卡风控的重要一环,业界图数据库产品,大多数不提供内置算法。华为云GES内置了30+算法,能快速帮助金融分析师,从海量数据中快速甄别异常用卡情况例如在金融反欺诈场景中,利用GES内置的丰富算法,可实现业务6跳查询秒级响应,环路检测分钟级响应,将担保风险感知由原先几十分钟降为1分钟左右,帮助客户挖掘出潜在的风险,为客户保驾护航。互联网行业客户面临自建基础设施成本高、应用上线周期长、已有方案效率低以及推荐效果不佳等挑战。基于华为云GES,可实现好友、商品或者咨询的个性化推荐,准确率高达80%;通过对用户画像、行为相似度或者好友关系等,进行用户分群,实现用户群体分析管理,效率提升高达90%;通过企业投资、控股等关联关系,提供企业间深度追溯的能力,实现了原先开源图数据库不能满足“一键穿透公司股权全景”的功能。 持续创新,让GES能力更专业在华为开发者大会2023(Cloud)上,华为云盘古大模型3.0重磅发布,华为云GES依托盘古大模型的多模态知识图谱和图嵌入的知识表征,可支持图神经网络算法,提升识别效果,辅助客户决策。未来,华为云GES将持续加大与数据分析平台以及盘古大模型的深度融合,继续坚持技术创新,为企业提供更灵活、更融合、更智能的服务,加速企业数字化转型,共创数字化新未来。关于IDC MarketScape:IDC MarketScape厂商评估模型旨在为特定市场中信息和通信技术(ICT)厂商的竞争力提供一个概述。研究方法采用严格的定性和定量的标准的评分方法,以单一的图形说明每个厂商在特定市场中的位置。IDC MarketScape提供了一个清晰的框架,在其中可以对IT和信息通信技术厂商的产品、服务、能力和策略以及当前和未来的市场成功因素进行有意义的比较。该框架还为技术买家提供了针对当前或潜在厂商的360度优劣势评估,为技术买家提供参考。
  • [问题求助] Node2Vec各个参数说明
    我想请问下,和这个“映射维度”可以解释详细一下么,一般怎么去确定这个范围x
  • [通用服务] 【AI使能】GES图引擎
    图引擎服务(Graph Engine Service,简称GES),使用华为自研的EYWA内核,是针对以“关系”为基础的“图”结构数据,进行查询、分析的服务。广泛应用于社交关系分析、营销推荐、舆情及社会化聆听、信息传播、防欺诈等具有丰富关系数据的场景。分类文档链接备注最新动态cid:link_5 特性清单cid:link_2 原子APIcid:link_3 FAQcid:link_4 华为云在线课程(免费)图引擎服务https://education.huaweicloud.com/courses/course-v1:HuaweiX+CBUCNXE008+Self-paced/about?isAuth=0&cfrom=hwc图引擎服务(Graph Engine Service),是针对以“关系”为基础的“图”结构数据,进行查询、分析的服务。广泛应用于社交关系分析、推荐、精准营销、舆情及社会化聆听、信息传播、防欺诈等具有丰富关系数据的场景。华为云培训服务(收费)基于图引擎的医药查询系统cid:link_1如何在当前琳琅满目的药品中选取合适自己病症的良药呢?在人工智能发展迅猛的当下,让AI为选取药品贡献一份力量吧。华为云开发者网GES开放能力cid:link_6 
  • 持续更新!图引擎服务GES优质文章精选汇总!
     华为GES图引擎服务优质博文精选图数据基础知识 & GES介绍人人都在谈的图数据库到底是个啥? 作者:你好_TT, 2021-05-08从零开始学Graph Database:什么是图 作者:弓乙, 2022-10-08画张图,就能秒级洞察千亿复杂关系 2021-01-12华为云新一代黑科技核心算法揭秘 作者:mr.FangYang, 2018-08-21云图说-解析华为云”黑科技“---图计算技术 作者:阅识风云, 2018-07-10聊聊图的相似性 作者:你好_TT, 2021-12-25图算法实践之k-hop 作者:你好_TT, 2021-05-12GES容灾介绍  2023-07-22【干货】华为云图数据库GES技术演进 作者:Chenyi, 2023-08-23华为云GES:十年磨一剑,打造业界一流的云原生分布式图数据库 2023-08-24GES使用指引 &图进阶学习华为云图引擎服务 GES 实战——创图 作者:你好_TT, 2021-08-22调用 GES 服务业务面 API 相关参数的获取 作者:你好_TT, 2021-08-23图数据库对 NULL 属性值支持情况 作者:你好_TT, 2021-06-18Gremlin语言学习系列链接汇总 作者:你好_TT, 2021-02-05如何使用GES进行社交关系考据?---GES查询能力介绍 作者:弓乙, 2021-10-19聊聊图上超级快的多跳过滤查询 作者:弓乙, 2023-4-12使用GES4Jupyter连接GES并进行图探索 作者:蜉蝣与海, 2022-06-25使用参数化查询提高Cypher查询的性能 作者:蜉蝣与海, 2022-04-10记一次图引擎GES cypher慢查询的分析与优化作者:蜉蝣与海, 2022-05-08GES对图细粒度权限控制的支持 作者:你好_TT, 2021-12-29使用Cypher子查询进行图探索 作者:蜉蝣与海, 2023-05-10华为云图引擎服务GES属性管理进阶 2024-01-15GES场景化应用全链路数据血缘在满帮的实践 作者:你好_TT, 2021-12-09GES与Flink的对接 作者:你好_TT, 2021-12-29要想推荐系统做的好,图技术少不了 作者:你好_TT, 2021-12-27图计算助力智慧金融 作者:你好_TT, 2020-04-18扒一扒GES如何赋能互联网电商风控 作者:Dr Thunder, 2021-04-23使用GES处理金融风控场景示例一 作者:图森破, 2020-05-19基于人货场的电商知识图谱的构建 作者:某某人, 2020-07-04采用GES构建锅炉仿真系统的关系图谱 作者:犀牛, 2020-06-28基于GES图数据库的网络架构模型构建 作者:左手看星星, 2020-07-29华为云ModelArts与图引擎联手打造,图深度学习强势落地! 作者:我们都是云专家, 2019-08-08基于GES图数据库的大规模数据追溯服务优化 2021-03-03618 技术特辑(一)不知不觉超预算3倍,你为何买买买停不下来? 作者:技术火炬手, 2021-06-11云图说-复杂网络的破解之道,图引擎带你径直迈向成功作者:阅识风云, 2019-10-16云图说-互联网应用的关系分析利器——企业EI的百晓生“图引擎”作者:阅识风云, 2019-04-19爱库存X华为云:乘“云”破浪,逐梦新电商: 外部链接 云社区链接构建站点数字孪生,支撑确定性运维:华为云九洲云图CloudMap 作者:HWCloudAI 2023-03-315分钟迁移关系型数据库到图数据库 作者:RiverSide 2023-07-17HyG超大规模图计算引擎专题GES图计算引擎HyG揭秘之图切分 作者:π, 2022-06-23CSR格式如何更新? GES图计算引擎HyG揭秘之数据更新 作者:π, 2023-06-15图神经网络 & 图深度学习专题图嵌入&知识表征の初体验 作者:图森破, 2020-05-15在OCR场景使用GCN图卷积 作者:图森破, 2020-06-11风控领域图深度学习算法思考 作者:图森破, 2020-07-14知识图谱trans系列算法介绍 作者:图森破, 2021-06-29图嵌入算法介绍 作者: 图森破, 2021-06-29图神经网络!打开企业盈利的下一个风口 作者:chenyi, 2019-12-28图卷积神经网络初探 作者:chenyi, 2019-11-29图技术漫谈Neo4j闭源转商,成为强大图计算平台还需要几步?作者:chenyi, 2019-12-28Freebase Data Dump结构初探, 作者:蜉蝣与海, 2021-07-27带你认识图数据库性能和场景测试利器LDBC SNB, 作者: 闹闹与球球, 2022-06-24从图引擎平台技术,看华为云EI的决心和野心作者:chenyi, 2018-01-29使用Jupyter可视化图查询语言Cypher语法树 作者:蜉蝣与海, 2022-08-22Euler浅析 作者:弓乙, 2019-01-23从两个开源图数据库PR看查询执行时的编码设计问题 作者:蜉蝣与海, 2022-05-03Notebook案例精选图数据库实践-新冠患者轨迹追溯电商风控案例教育知识图谱利用图数据库研究COVID-19论文数据集基于图引擎的医药查询系统Koolab新冠患者轨迹追溯端边云Serverless大数据湖解决方案附录:GES首页:cid:link_21GES最新动态:cid:link_17AI训练营图数据库系列 作者:Ray博士第一讲第二讲第三讲开发者中心-图引擎服务GES开发指南:cid:link_0GES帮助文档:cid:link_9GES算法API参数参考:cid:link_11
  • [云服务] 【数据使能】图引擎服务GES能力项
    分类文档链接备注最新动态cid:link_5特性清单cid:link_2原子APIcid:link_3FAQcid:link_4华为云在线课程(免费)图引擎服务https://education.huaweicloud.com/courses/course-v1:HuaweiX+CBUCNXE008+Self-paced/about?isAuth=0&cfrom=hwc图引擎服务(Graph Engine Service),是针对以“关系”为基础的“图”结构数据,进行查询、分析的服务。广泛应用于社交关系分析、推荐、精准营销、舆情及社会化聆听、信息传播、防欺诈等具有丰富关系数据的场景。华为云培训服务(收费)基于图引擎的医药查询系统cid:link_1如何在当前琳琅满目的药品中选取合适自己病症的良药呢?在人工智能发展迅猛的当下,让AI为选取药品贡献一份力量吧。华为云开发者网GES开放能力cid:link_6
  • [教程] 从零开始学Graph Database:什么是图
    传统上我们使用图来解决一些数学问题。比如图论起源于著名的柯尼斯堡七桥问题, 该问题被欧拉推广为:怎样判断是否存在着一个恰好包含了所有边,且没有重复的路径。即一笔画问题。当然了,图并非只能解决这类图论经典问题(如 四色问题,马的遍历问题,邮递员问题, 网络流问题 ),只要能够将研究对象表示为图结构,就能利用图的特点来解决问题,甚至大部分情况下,并不需要使用到多么高深的算法。 详情参见:《从零开始学Graph Database(1)》
  • [技术干货] 使用Jupyter可视化查询语句的语法树--以图查询语言Cypher为例
    “语法解析”和“词法解析”是计算机理解查询语句的重要一环。而词法和语法的解析依赖于一定的文法规则,有诸多网站可以可视化文法规则,但是对于根据文法规则生成的语法树进行可视化的文章却比较少。对文法规则生成的语法树进行可视化,可以降低查询语言的理解成本。本文以华为图引擎使用的cypher查询语言为例,将查询语句的解析结果(语法树)在jupyterLab上可视化。案例中使用的工具不仅可以可视化cypher语言的语法树结构,对其他antlr生成的抽象语法树同样适用。详情参见:cid:link_1AI Gallery案例地址为:cid:link_0
  • [算子编译] 请问Graph Kernel Fusion(图算融合)在mindspore1.7.0下会生成融合后的mindIR的.dot文件吗
    【功能模块】图算融合,GPU (NVIDIA-RTX3080) 验证【操作步骤&问题现象】1、参考(基于mindspore0.5.0)链接1: https://gitee.com/mindspore/course/tree/master/06_distributed/graph_kernel2、参考(基于mindspore1.0.0)链接2: https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=78817&page=1&replytype=13、按照教程和另一位大佬的帖子开启图算融合后,对基本组合算子和自组合算子进行试验,发现mindspore1.7.0生成的ir和.dot文件和之前版本的mindir文件的命名形式不一样,发现没有生成例子当中的文件(hwopt_d_fuse_basic_opt_end_graph_0.dot/hwopt_d_composite_opt_end_graph_0.dot)。未找到如下图红框中类似的图算融合后生成的ir/dot文件.minspore1.0.0生成的ir文件如下图(源自链接2楼主)请问是否有图算融合的整体流程图(细化到生成每个IR的小阶段)参考,多谢!【截图信息】本人基于mindspore1.7.0生成的mindir文件信息中,未找到图算融合后的.dot。烦请指导~多谢【日志信息】(可选,上传日志内容或者附件)
  • [技术干货] 将Graph Explorer搬上JupyterLab:使用GES4Jupyter连接GES并进行图探索
    GES4Jupyter是一款可以在JupyterLab中连接访问GES并可视化的工具。工具中封装了部分GES业务面接口,并提供对返回数据的可视化能力。基于该工具在Jupyter上进行图探索,可以大大降低编码成本,丰富JupyterLab的数据表现力。详情参考:https://bbs.huaweicloud.com/blogs/361607
  • [教程] 将Graph Explorer搬上JupyterLab:使用GES4Jupyter连接GES并进行图探索
    GES4Jupyter是一款可以在JupyterLab中连接访问GES并可视化的工具。工具中封装了部分GES业务面接口,并提供对返回数据的可视化能力。基于该工具在Jupyter上进行图探索,可以大大降低编码成本,丰富JupyterLab的数据表现力。本文截选自华为云社区《将Graph Explorer搬上JupyterLab:使用GES4Jupyter连接GES并进行图探索》 ,欲查看详情,请点击链接查看博文:https://bbs.huaweicloud.com/blogs/361607
  • [技术干货] GES超大规模图计算引擎HyG揭秘之图切分
    GES大规模图计算引擎HyG通过实现不同的点边分区算法,可以灵活地供用户选择多种多样的切分策略,进而达到更好的运算性能。 详情参考:https://bbs.huaweicloud.com/blogs/360632
  • [技术干货] 查询语句写了limit 1,为什么依然很慢? 记一次图引擎GES cypher慢查询的分析与优化
    很多时候计算引擎会对语句进行代价估计并调整语句的执行顺序。执行计划是语句如何执行的直观表达。语句如何执行不能只关注语句写法,要想写出符合预期执行顺序的查询语句,还需要关注语句执行计划。 详情参见:https://bbs.huaweicloud.com/blogs/355321