标量函数

id

id() 返回顶点或边的 id。

语法:id(expression)

返回值:

agtype 整数。

参数:

名称 描述
expression 返回顶点或边的表达式。

查询:

SELECT *
FROM cypher('graph_name', $$
    MATCH (a)
    RETURN id(a)
$$) as (id agtype);

结果:

 id     
 ------ 
 0      
 1      
 2      
 3      
 (4 rows) 

start_id

start_id() 返回边的起始顶点的 id。

语法:start_id(expression)

返回值:

agtype 整数。

参数:

名称 描述
expression 求值为边的表达式。

查询:

SELECT *
FROM cypher('graph_name', $$
    MATCH ()-[e]->()
    RETURN start_id(e)
$$) as (start_id agtype);

结果:

 start_id 
 -------- 
 0        
 1        
 2        
 3        
(4 rows)  

end_id

end_id() 返回边的终止顶点的 id。

语法:end_id(expression)

返回值:

agtype 整数。

参数:

名称 描述
expression 求值为边的表达式。

查询:

SELECT *
FROM cypher('graph_name', $$
    MATCH ()-[e]->()
    RETURN end_id(e)
$$) as (end_id agtype);

结果:

 end_id 
 ------ 
 4      
 5      
 6      
 7      
(4 rows) 

type

type() 返回边类型的字符串表示。

语法:type(edge)

返回值:

agtype 字符串。

参数:

名称 描述
edge 求值为边的表达式。

查询:

SELECT *
FROM cypher('graph_name', $$
    MATCH ()-[e]->()
    RETURN type(e)
$$) as (type agtype);

结果:

  type    
------- 
"KNOWS" 
"KNOWS" 
(2 rows) 

properties

返回包含顶点或边所有属性的 agtype 映射。如果参数已经是映射,则原样返回。

语法:properties(expression)

返回值:

agtype 映射。

参数:

名称 描述
expression 返回顶点、边或 agtype 映射的表达式。

注意事项:

  • properties(null) 返回 null

查询:

SELECT *
FROM cypher('graph_name', $$
    CREATE (p:Person {name: 'Stefan', city: 'Berlin'})
    RETURN properties(p)
$$) as (type agtype);

结果:

          properties              
-------------------------------- 
{name: "Stefan"; city: "Berlin"} 
(1 rows)

head

返回 agtype 列表中的第一个元素。

语法:head(list)

返回值:

返回值的类型与列表第一个元素的类型相同。

参数:

名称 描述
list 返回列表的表达式

注意事项:

  • head(null) 返回 null
  • 如果列表中的第一个元素是 nullhead(list) 将返回 null

查询

SELECT *
FROM cypher('graph_name', $$
   MATCH (a)
   WHERE a.name = 'Eskil'
   RETURN a.array, head(a.array)
$$) as (lst agtype, lst_head agtype);

返回列表中的第一个元素。

结果:

         lst          | lst_head 
----------------------+-------- 
["one","two","three"] | "one"    
(1 rows)  

last

返回 agtype 列表中的最后一个元素。

语法:last(list)

返回值:

返回值的类型与列表最后一个元素的类型相同。

参数:

名称 描述
list 返回列表的表达式

注意事项:

  • tail(null) 返回 null
  • 如果列表中的最后一个元素是 nulllast(list) 将返回 null

查询

SELECT *
FROM cypher('graph_name', $$
MATCH (a)
WHERE a.name = 'Eskil'
RETURN a.array, last(a.array)
$$) as (lst agtype, lst_tail agtype);

返回列表中的最后一个元素。

结果:

        lst           | lst_tail 
--------------------- + -------- 
["one","two","three"] | "three"  
 (1 rows)             

length

length() 返回路径的长度。

语法:length(path)

返回值:

agtype 整数。

参数:

名称 描述
path 返回路径的表达式。

注意事项:length(null) 返回 null

查询

SELECT *
FROM cypher('graph_name', $$
   MATCH p = (a)-[]->(b)-[]->(c)
   WHERE a.name = 'Alice'
   RETURN length(p)
$$) as (length_of_path agtype);

返回路径 p 的长度。

结果:

 length_of_path
----------------
 2
 2
 2
(3 rows)

size

size() 返回列表的长度。

语法:size(list)

返回值:

agtype 整数。

参数:

名称 描述
list 返回列表的表达式。

注意事项:

  • size(null) 返回 null

查询

SELECT *
FROM cypher('graph_name', $$
    RETURN size(['Alice', 'Bob'])
$$) as (size_of_list agtype);

返回列表的长度。

结果:

 size_of_list
--------------
 2
(1 row)

startNode

startNode() 返回边的起始节点。

注意! 在 YMatrix AGE 中,startNode()endNode() 在分布式环境下可能报错:

ERROR: graphid cde <id> does not exist

这是因为边和节点可能分布在不同的 segment 上,startNode()/endNode() 需要根据 graphid 查找节点,但该节点可能不在当前 segment 上。

替代方案:使用 start_id()/end_id() 获取 graphid,然后通过 MATCH 查找对应节点。

语法:startNode(edge)

返回值:

一个顶点。

参数:

名称 描述
edge 返回边的表达式。

注意事项:

  • startNode(null) 返回 null

查询

SELECT *
FROM cypher('graph_name', $$
    MATCH (x:Developer)-[r]-()
    RETURN startNode(r)
$$) as (v agtype);

结果:

                      v                                         
 ----------------------------------------- 
 Node[0]{name:"Alice",age:38,eyes:"brown"} 
 Node[0]{name:"Alice",age:38,eyes:"brown"} 
 (2 row)                                   

endNode

endNode() 返回边的终止节点。

语法:endNode(edge)

返回值:

一个顶点。

参数:

名称 描述
edge 返回边的表达式。

注意事项:

  • endNode(null) 返回 null

查询

SELECT *
FROM cypher('graph_name', $$
    MATCH (x:Developer)-[r]-()
    RETURN endNode(r)
$$) as (v agtype);

结果:

                      v                        
 ------------------------------------------- 
 Node[2]{name:"Charlie",age:53,eyes:"green"} 
 Node[1]{name:"Bob",age:25,eyes:"blue"}      
(2 row)                                      

timestamp

timestamp() 返回当前时间与 1970 年 1 月 1 日 UTC 午夜之间的差值(以毫秒为单位)。

语法:timestamp()

返回值:

agtype 整数。

注意事项:

  • timestamp() 在整个查询期间返回相同的值,即使是长时间运行的查询也是如此。

查询

SELECT *
FROM cypher('graph_name', $$
    RETURN timestamp()
$$) as (t agtype);

返回以毫秒为单位的时间。

结果:

       t
---------------
 1773998074375
(1 row)

toBoolean

toBoolean() 将字符串值转换为布尔值。

语法:toBoolean(expression)

返回值:

agtype 布尔值。

参数:

名称 描述
expression 返回布尔或字符串值的表达式。

注意事项:

  • toBoolean(null) 返回 null
  • 如果 expression 是布尔值,将原样返回。
  • 如果解析失败,将返回 null

查询

SELECT *
FROM cypher('graph_name', $$
    RETURN toBoolean('TRUE'), toBoolean('not a boolean')
$$) as (a_bool agtype, not_a_bool agtype);

结果:

 a_bool | not_a_bool
--------+------------
 true   |
(1 row)

toFloat

toFloat() 将整数或字符串值转换为浮点数。

语法:toFloat(expression)

返回值:

浮点数。

参数:

名称 描述
expression 返回 agtype 数值或 agtype 字符串值的表达式。

注意事项:

  • toFloat(null) 返回 null
  • 如果 expression 是浮点数,将原样返回。
  • 如果解析失败,将返回 null

查询

SELECT *
FROM cypher('graph_name', $$
    RETURN toFloat('11.5'), toFloat('not a number')
$$) as (a_float agtype, not_a_float agtype);

结果:

 a_float | not_a_float
---------+-------------
 11.5    |
(1 row)

toInteger

toInteger() 将浮点数或字符串值转换为整数值。

语法:toInteger(expression)

返回值:

agtype 整数。

参数:

名称 描述
expression 返回 agtype 数值或 agtype 字符串值的表达式。

注意事项:

  • toInteger(null) 返回 null
  • 如果 expression 是整数值,将原样返回。
  • 如果解析失败,将返回 null

查询

SELECT *
FROM cypher('graph_name', $$
     RETURN toInteger('42'), toInteger('not a number')
$$) as (an_integer agtype, not_an_integer agtype);

结果:

 an_integer | not_an_integer
------------+----------------
 42         |
(1 row)

coalesce

coalesce() 返回给定表达式列表中的第一个非 null 值。

语法:coalesce(expression [, expression]*)

返回值:

返回值的类型与第一个非 null 表达式的类型相同。

参数:

名称 描述
expression 可能返回 null 的表达式。

注意事项:

  • 如果所有参数都是 null,将返回 null

查询

SELECT *
FROM cypher('graph_name', $$
MATCH (a)
WHERE a.name = 'Alice'
RETURN coalesce(a.hairColor, a.eyes), a.hair_color, a.eyes
$$) as (color agtype, hair_color agtype, eyes agtype);

结果:

  color  | hair_color |  eyes
---------+------------+---------
 "brown" |            | "brown"
(1 row)