列表函数¶
本文介绍 NebulaGraph 支持的列表(List)函数。部分列表函数在原生 nGQL 语句和 openCypher 兼容语句中的语法不同。
注意事项¶
- 和 SQL 一样,nGQL 的字符索引(位置)从
1
开始。但是 C 语言的字符索引是从0
开始的。
通用¶
range()¶
range() 返回指定整数范围[start,end]
内固定步长的列表。
语法:range(start, end [, step])
step
:可选参数。步长。默认为1
。
- 返回类型:list。
示例:
nebula> RETURN range(1,9,2);
+-----------------+
| range(1,9,2) |
+-----------------+
| [1, 3, 5, 7, 9] |
+-----------------+
reverse()¶
reverse() 返回将原列表逆序排列的新列表。
语法:reverse(<list>)
- 返回类型:list。
示例:
nebula> WITH [NULL, 4923, 'abc', 521, 487] AS ids \
RETURN reverse(ids);
+-----------------------------------+
| reverse(ids) |
+-----------------------------------+
| [487, 521, "abc", 4923, __NULL__] |
+-----------------------------------+
tail()¶
tail() 返回不包含原列表第一个元素的新列表。
语法:tail(<list>)
- 返回类型:list。
示例:
nebula> WITH [NULL, 4923, 'abc', 521, 487] AS ids \
RETURN tail(ids);
+-------------------------+
| tail(ids) |
+-------------------------+
| [4923, "abc", 521, 487] |
+-------------------------+
head()¶
head() 返回列表的第一个元素。
语法:head(<list>)
- 返回类型:与原列表内的元素类型相同。
示例:
nebula> WITH [NULL, 4923, 'abc', 521, 487] AS ids \
RETURN head(ids);
+-----------+
| head(ids) |
+-----------+
| __NULL__ |
+-----------+
last()¶
last() 返回列表的最后一个元素。
语法:last(<list>)
- 返回类型:与原列表内的元素类型相同。
示例:
nebula> WITH [NULL, 4923, 'abc', 521, 487] AS ids \
RETURN last(ids);
+-----------+
| last(ids) |
+-----------+
| 487 |
+-----------+
reduce()¶
reduce() 将表达式逐个应用于列表中的元素,然后和累加器中的当前结果累加,最后返回完整结果。该函数将遍历给定列表中的每个元素 e,在 e 上运行表达式并和累加器的当前结果累加,将新的结果存储在累加器中。这个函数类似于函数式语言(如 Lisp 和 Scala)中的 fold 或 reduce 方法。
openCypher 兼容性
在 openCypher 中,reduce()
函数没有定义。nGQL 使用了 Cypher 方式实现reduce()
函数。
语法:reduce(<accumulator> = <initial>, <variable> IN <list> | <expression>)
accumulator
:在遍历列表时保存累加结果。
initial
:为accumulator
提供初始值的表达式或值。
variable
:为列表引入一个变量,决定使用列表中的哪个元素。
list
:列表或列表表达式。
expression
:该表达式将对列表中的每个元素运行一次,并将结果累加至accumulator
。
- 返回类型:取决于提供的参数,以及表达式的语义。
示例:
nebula> RETURN reduce(totalNum = -4 * 5, n IN [1, 2] | totalNum + n * 2) AS r;
+-----+
| r |
+-----+
| -14 |
+-----+
nebula> MATCH p = (n:player{name:"LeBron James"})<-[:follow]-(m) \
RETURN nodes(p)[0].player.age AS src1, nodes(p)[1].player.age AS dst2, \
reduce(totalAge = 100, n IN nodes(p) | totalAge + n.player.age) AS sum;
+------+------+-----+
| src1 | dst2 | sum |
+------+------+-----+
| 34 | 31 | 165 |
| 34 | 29 | 163 |
| 34 | 33 | 167 |
| 34 | 26 | 160 |
| 34 | 34 | 168 |
| 34 | 37 | 171 |
+------+------+-----+
nebula> LOOKUP ON player WHERE player.name == "Tony Parker" YIELD id(vertex) AS VertexID \
| GO FROM $-.VertexID over follow \
WHERE properties(edge).degree != reduce(totalNum = 5, n IN range(1, 3) | properties($$).age + totalNum + n) \
YIELD properties($$).name AS id, properties($$).age AS age, properties(edge).degree AS degree;
+---------------------+-----+--------+
| id | age | degree |
+---------------------+-----+--------+
| "Tim Duncan" | 42 | 95 |
| "LaMarcus Aldridge" | 33 | 90 |
| "Manu Ginobili" | 41 | 95 |
+---------------------+-----+--------+
原生 nGQL 语句适用¶
keys()¶
keys() 返回一个列表,包含字符串形式的点、边的所有属性。
语法:keys({vertex | edge})
- 返回类型:list。
示例:
nebula> LOOKUP ON player \
WHERE player.age > 45 \
YIELD keys(vertex);
+-----------------+
| keys(VERTEX) |
+-----------------+
| ["age", "name"] |
| ["age", "name"] |
+-----------------+
labels()¶
labels() 返回点的 Tag 列表。
语法:labels(verte)
- 返回类型:list。
示例:
nebula> FETCH PROP ON * "player101", "player102", "team204" \
YIELD labels(vertex);
+----------------+
| labels(VERTEX) |
+----------------+
| ["player"] |
| ["player"] |
| ["team"] |
+----------------+
openCypher 兼容语句适用¶
keys()¶
keys() 返回一个列表,包含字符串形式的点、边或映射的所有属性。
语法:keys(<vertex_or_edge>)
- 返回类型:list。
示例:
nebula> MATCH (v:player{name:"Tim Duncan"})-[e]->() \
RETURN keys(e);
+----------------------------+
| keys(e) |
+----------------------------+
| ["end_year", "start_year"] |
| ["degree"] |
| ["degree"] |
+----------------------------+
labels()¶
labels() 返回点的 Tag 列表。
语法:labels(<vertex>)
- 返回类型:list。
示例:
nebula> MATCH (v)-[e:serve]->() \
WHERE id(v)=="player100" \
RETURN labels(v);
+------------+
| labels(v) |
+------------+
| ["player"] |
+------------+
nodes()¶
nodes() 返回路径中所有点的列表。包括点 ID、Tag、属性和值。
语法:nodes(<path>)
- 返回类型:list。
示例:
nebula> MATCH p=(v:player{name:"Tim Duncan"})-->(v2) \
RETURN nodes(p);
+-------------------------------------------------------------------------------------------------------------+
| nodes(p) |
+-------------------------------------------------------------------------------------------------------------+
| [("player100" :player{age: 42, name: "Tim Duncan"}), ("team204" :team{name: "Spurs"})] |
| [("player100" :player{age: 42, name: "Tim Duncan"}), ("player101" :player{age: 36, name: "Tony Parker"})] |
| [("player100" :player{age: 42, name: "Tim Duncan"}), ("player125" :player{age: 41, name: "Manu Ginobili"})] |
+-------------------------------------------------------------------------------------------------------------+
relationships()¶
relationships() 返回路径中所有关系的列表。
语法:relationships(<path>)
- 返回类型:list。
示例:
nebula> MATCH p=(v:player{name:"Tim Duncan"})-->(v2) \
RETURN relationships(p);
+-------------------------------------------------------------------------+
| relationships(p) |
+-------------------------------------------------------------------------+
| [[:serve "player100"->"team204" @0 {end_year: 2016, start_year: 1997}]] |
| [[:follow "player100"->"player101" @0 {degree: 95}]] |
| [[:follow "player100"->"player125" @0 {degree: 95}]] |
+-------------------------------------------------------------------------+