跳转至
开发版采用单机部署,无需产品 License 文件。需要多机部署或大规模性能测试? 了解企业版

图元素函数

本文介绍 GQL 支持的图元素相关函数,并基于示例数据集提供示例。

Note

图元素函数返回的标识符由系统自动生成,仅在同一系统内唯一。

分类

分类 函数
点函数 element_id()、labels()、type()
边函数 multiedge_id()、left_node_id()、right_node_id()、start_node_id()、end_node_id()、labels()、type()
路径函数 nodes()、edges()/relationships()、length()、cardinality()

Note

此外,还支持使用 ALL_DIFFERENT 谓词和 SAME 谓词检查图元素的一致性。

点函数

element_id()

返回图中点的唯一标识符。

NULL 行为:默认

函数签名

element_id(n: NODE) -> INT64

示例

返回点类型为Actor的点的 ID
USE movie MATCH (v@Actor) RETURN element_id(v) AS id, v.name AS name LIMIT 5

返回:

+--------------------+---------------------------+
| id                 | name                      |
+--------------------+---------------------------+
| 288342985899245569 | Mark Christopher Lawrence |
| 288343033143885825 | Al Pacino                 |
| 288343153402970113 | Richard Boes              |
| 288343161992904705 | Zheng Tia Yong            |
| 288343200647610369 | Peter Lawford             |
+--------------------+---------------------------+

labels()

返回点的所有标签。

NULL 行为:默认

函数签名

labels(n: NODE) -> LIST<STRING>

示例

返回点的标签
'''
USE movie
MATCH (v)-[]->(m)
WHERE v.id = 133
RETURN labels(m) AS m_labels
'''

返回:

+----------+
| m_labels |
+----------+
| [Movie]  |
+----------+

type()

返回点类型名。

NULL 行为:默认

函数签名

type(n: NODE) -> STRING

示例

返回点的点类型名
'''
USE movie
MATCH (v:Person)
RETURN DISTINCT type(v) AS node_types
'''

返回:

+------------+
| node_types |
+------------+
| Director   |
| User       |
| Actor      |
+------------+

边函数

multiedge_id()

基于平行边的多边键,返回用于区分特定平行边的唯一标识符。若不存在平行边,则返回0。

NULL 行为:默认

函数签名

multiedge_id(e: EDGE) -> INT64

示例

不存在平行边时,查询该标识符
'''
USE movie 
MATCH ()-[e]->() RETURN multiedge_id(e) AS e LIMIT 5
'''

返回:

+---+
| e |
+---+
| 0 |
| 0 |
| 0 |
| 0 |
| 0 |
+---+

上述语句使用的图中不存在平行边,因此返回值为0。

存在平行边时,查询该标识符
'''
// 创建边类型带多边键的图类型
CREATE GRAPH TYPE IF NOT EXISTS multi_edges AS { 
    NODE Person (LABEL Person {id INT64, name STRING, PRIMARY KEY (id)}), 
    EDGE `Like` (Person)-[:`Like` {rate FLOAT, MULTIEDGE KEY (rate)}]->(Person) }
'''

'''
// 创建图
CREATE GRAPH IF NOT EXISTS multiedges TYPED multi_edges
'''

'''
// 插入两个点以及两条平行边
USE multiedges 
INSERT (n@Person{id:3, name:"Alice"})-[@`Like`{rate: 3.1}]->(m@Person{id:4, name:"Bob"}), 
(n)-[@`Like`{rate: 3.3}]->(m)
'''

'''
// 查询两点之间平行边的由多边键生成的标识符
USE multiedges MATCH (@Person{id:3})-[e]->(@Person{id:4}) RETURN multiedge_id(e) AS a
'''

返回:

+------------+
| a          |
+------------+
| 1078355558 |
| 1079194419 |
+------------+

left_node_id()

返回给定路径中指定边左侧点的唯一标识符。

NULL 行为:错误

函数签名

left_node_id(e: EDGE) -> INT64

示例

返回给定路径中一条边左侧点的 ID
'''
USE movie MATCH p = (v)<-[e]-(m) 
RETURN left_node_id(e) AS left_id, element_id(v) AS v_id, e AS edge 
LIMIT 5
'''

返回:

+--------------------+--------------------+----------------------------------------------------------+
| left_id            | v_id               | edge                                                     |
+--------------------+--------------------+----------------------------------------------------------+
| 289329634376417282 | 289329634376417282 | (288247435761811457)-[0@Act:Act{}]->(289329634376417282) |
| 289329634376417282 | 289329634376417282 | (288249956907614209)-[0@Act:Act{}]->(289329634376417282) |
| 289329634376417282 | 289329634376417282 | (288264602746093569)-[0@Act:Act{}]->(289329634376417282) |
| 289329634376417282 | 289329634376417282 | (288266148934320129)-[0@Act:Act{}]->(289329634376417282) |
| 289329634376417282 | 289329634376417282 | (288346404693213185)-[0@Act:Act{}]->(289329634376417282) |
+--------------------+--------------------+----------------------------------------------------------+

上述语句指定了路径(v)<-[e]-(m),边[e]在该路径中左侧点的 ID 即为点(v)的 ID。

right_node_id()

返回给定路径中指定边右侧点的唯一标识符。

NULL 行为:错误

函数签名

right_node_id(e: EDGE) -> INT64

示例

返回给定路径中一条边右侧点的 ID
'''
USE movie MATCH p = (v)<-[e]-(m) 
RETURN right_node_id(e) AS right_id, element_id(m) AS m_id, e AS edge 
LIMIT 5
'''

返回:

+--------------------+--------------------+----------------------------------------------------------+
| right_id           | m_id               | edge                                                     |
+--------------------+--------------------+----------------------------------------------------------+
| 288238622488920065 | 288238622488920065 | (288238622488920065)-[0@Act:Act{}]->(289131417340739586) |
| 288243608945950721 | 288243608945950721 | (288243608945950721)-[0@Act:Act{}]->(289131417340739586) |
| 288317563987820545 | 288317563987820545 | (288317563987820545)-[0@Act:Act{}]->(289131417340739586) |
| 288324427345559553 | 288324427345559553 | (288324427345559553)-[0@Act:Act{}]->(289131417340739586) |
| 288345352426225665 | 288345352426225665 | (288345352426225665)-[0@Act:Act{}]->(289131417340739586) |
+--------------------+--------------------+----------------------------------------------------------+

上述语句指定了路径(v)<-[e]-(m),边[e]在该路径中右侧点的 ID 即为点(m)的 ID。

start_node_id()

返回边的起始点 ID。对于有向边,返回源点 ID;对于无向边,返回两个点 ID 中较小的一个。

NULL 行为:默认

函数签名

start_node_id(e: EDGE) -> INT64

示例

使用 start_node_id() 判断路径方向

以下示例基于 movie 示例数据集,使用start_node_id()检查无向边匹配路径中每条边的实际方向,构建带边类型标签的路径拓扑。

'''
USE movie MATCH p= TRAIL (a:Actor{name:"Al Pacino"})-[:Act|Direct]-{1,3}()
RETURN range(0,length(p)) AS range,
       nodes(p) AS nodes,
       edges(p) AS edges
NEXT USE movie RETURN
       reduce(range, "", (state, i) -> state || "(" || (nodes[i]).name || ":" || type(nodes[i]) || ")" || case when i+1=size(range) then "" else case when start_node_id(edges[i])=element_id(nodes[i]) then "-["|| type(edges[i]) || "]->" else "<-[" || type(edges[i]) || "]-" end end)
       AS path_topology
LIMIT 5
'''

返回:

+---------------------------------------------------------------------------------------------------------------+
| path_topology                                                                                                 |
+---------------------------------------------------------------------------------------------------------------+
| (Al Pacino:Actor)-[Act]->(The Godfather II:Movie)                                                             |
| (Al Pacino:Actor)-[Act]->(The Godfather Coda: The Death of Michael Corleone:Movie)                            |
| (Al Pacino:Actor)-[Act]->(Ocean's Thirteen:Movie)                                                             |
| (Al Pacino:Actor)-[Act]->(Der Pate:Movie)                                                                     |
| (Al Pacino:Actor)-[Act]->(The Godfather Coda: The Death of Michael Corleone:Movie)<-[Act]-(Talia Shire:Actor) |
+---------------------------------------------------------------------------------------------------------------+

上述示例使用无向边匹配-[:Act|Direct]-遍历路径,start_node_id()用于判断每条边相对当前点的方向:若start_node_id(edges[i])等于当前点 ID,则边从当前点出发(->);否则边指向当前点(<-)。对于有向边,start_node_id()始终返回源点 ID。

end_node_id()

返回边的结束点 ID。对于有向边,返回目标点 ID;对于无向边,返回两个点 ID 中较大的一个。

NULL 行为:默认

函数签名

end_node_id(e: EDGE) -> INT64

示例

使用 end_node_id() 判断路径方向

以下示例基于 movie 示例数据集,使用end_node_id()重建TRAIL匹配遍历的每条路径的拓扑,将边方向展示为->或<-。

'''
USE movie MATCH p= TRAIL (a:Actor{name:"Al Pacino"})-[:Act]-{1,3}()
RETURN range(0,length(p)) AS range,
       nodes(p) AS nodes,
       edges(p) AS edges
NEXT USE movie RETURN
       reduce(range, "", (state, i) -> state || (nodes[i]).name || case when i+1=size(range) then "" else case when end_node_id(edges[i])<>element_id(nodes[i]) then "->" else "<-" end end)
       AS path_topology
LIMIT 5
'''

返回:

+--------------------------------------------------------------+
| path_topology                                                |
+--------------------------------------------------------------+
| Al Pacino->Der Pate                                          |
| Al Pacino->Ocean's Thirteen                                  |
| Al Pacino->The Godfather II                                  |
| Al Pacino->The Godfather Coda: The Death of Michael Corleone |
| Al Pacino->The Godfather II<-Lee Strasberg                   |
+--------------------------------------------------------------+

上述示例使用无向边匹配-[:Act]-遍历路径。对于有向边Act(Actor→Movie),若end_node_id(edges[i])等于当前点 ID,则该边指向当前点(<-);否则该边从当前点出发(->)。对于无向边,end_node_id()返回两端点 ID 中较大的一个。

labels()

返回边的所有标签。

NULL 行为:默认

函数签名

labels(e: EDGE) -> LIST<STRING>

示例

返回边的标签
'''
USE movie
MATCH (v)-[e]->(m)
WHERE v.id = 133
RETURN labels(e) AS e_labels
'''

返回:

+----------+
| e_labels |
+----------+
| [Watch]  |
+----------+

type()

返回边类型名。

NULL 行为:默认

函数签名

type(e: EDGE) -> STRING

示例

返回边的边类型名
'''
USE movie
MATCH ()-[e]->()
RETURN DISTINCT type(e) AS edge_types
'''

返回:

+------------+
| edge_types |
+------------+
| Direct     |
| Act        |
| Watch      |
| WithGenre  |
+------------+

路径函数

nodes()

以列表的形式返回路径中的所有点。

NULL 行为:默认

函数签名

nodes(p: PATH) -> LIST<NODE>

示例

返回包含两个点组成的路径中的点
USE movie MATCH p=(m@Movie)<-[e:Watch]-(n@`User`) RETURN nodes(p) LIMIT 5

返回:

+--------------------------------------------------------------------------------------------------------------------------------+
| nodes(p)                                                                                                                       |
+--------------------------------------------------------------------------------------------------------------------------------+
| [(289219219357171713@Movie:Movie{id:651,name:M*A*S*H}),(288991745004273665@User:Person{id:188})]                               |
| [(289222513597087745@Movie:Movie{id:473,name:Pi}),(288982321846026242@User:Person{id:162})]                                    |
| [(289315070142316545@Movie:Movie{id:252,name:"Willy Wonka & the Chocolate Factory"}),(288993205293154307@User:Person{id:269})] |
| [(289159802779598849@Movie:Movie{id:648,name:"Beauty and the Beast"}),(288990585363103745@User:Person{id:444})]                |
| [(289222513597087745@Movie:Movie{id:473,name:Pi}),(288990585363103745@User:Person{id:444})]                                    |
+--------------------------------------------------------------------------------------------------------------------------------+

edges()/relationships()

以列表的形式返回路径中的所有边。

NULL 行为:默认

函数签名

edges(p: PATH) | relationships(p: PATH) -> LIST<EDGE>

示例

返回包含两个点的路径中的边
USE movie MATCH p=(m@Movie)<-[e:Watch]-(n@`User`) RETURN edges(p) AS p LIMIT 5

或

USE movie MATCH p=(m@Movie)<-[e:Watch]-(n@`User`) RETURN relationships(p) AS p LIMIT 5

返回:

+------------------------------------------------------------------------+
| p                                                                      |
+------------------------------------------------------------------------+
| [(288975157840576514)-[0@Watch:Watch{rate:5.0}]->(289169659729543169)] |
| [(288975157840576514)-[0@Watch:Watch{rate:5.0}]->(289158106267516929)] |
| [(288985753524895745)-[0@Watch:Watch{rate:4.0}]->(289100304597647361)] |
| [(288985753524895745)-[0@Watch:Watch{rate:4.0}]->(289078181221105665)] |
| [(288985753524895745)-[0@Watch:Watch{rate:4.0}]->(289159802779598849)] |
+------------------------------------------------------------------------+

length()

返回路径的长度,即路径中边的数量。

该函数还可以用于返回列表中的元素数量或字符串中的字符数量。更多信息,请参见列表函数length()和字符串函数length()。

NULL 行为:默认

函数签名

length(p: PATH) -> INT32

示例

返回由三个点组成的路径长度
'''
USE movie 
MATCH p=(v@Genre)-[e2]-(m@Movie)-[e1]-(n@`User`) 
RETURN length(p) 
LIMIT 2
'''

返回:

+-----------+
| length(p) |
+-----------+
| 2         |
| 2         |
+-----------+

cardinality()

返回路径中的元素数量。

该函数还可以用于返回列表或记录中的元素数量。更多信息,请参见列表函数cardinality()。

NULL 行为:默认

函数签名

cardinality(input: PATH) -> INT32

示例

返回路径中元素的数量
'''
USE movie 
MATCH p=(a:Movie{name:"Unpromised Land"})-[e:WithGenre]->{1,2}(b:Genre) RETURN cardinality(p) AS a 
'''

返回:

+---+
| a |
+---+
| 3 |
| 3 |
+---+

上述示例返回每个路径中的元素总数,包括 2 个点和 1 条边。