跳转至

列表函数

本文介绍 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(<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].age AS src1,  nodes(p)[1].age AS dst2,  \
        reduce(totalAge = 100, n IN nodes(p) | totalAge + n.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}]]                    |
+-------------------------------------------------------------------------+

最后更新: February 23, 2023