列表

列表(List)是复合数据类型,一个列表是一组元素的序列,可以通过元素在序列中的位置访问列表中的元素。

列表用左方括号([)和右方括号(])包裹多个元素,各个元素之间用英文逗号(,)隔开。元素前后的空格在列表中被忽略,因此可以使用换行符、制表符和空格调整格式。

示例

  1. # 返回列表[1,2,3]
  2. nebula> RETURN [1, 2, 3] AS List;
  3. +-----------+
  4. | List |
  5. +-----------+
  6. | [1, 2, 3] |
  7. +-----------+
  8. # 返回列表[1,2,3,4,5]中位置下标为3的元素。列表的位置下标是从0开始,因此返回的元素为4。
  9. nebula> RETURN range(1,5)[3];
  10. +---------------+
  11. | range(1,5)[3] |
  12. +---------------+
  13. | 4 |
  14. +---------------+
  15. # 返回列表[1,2,3,4,5]中位置下标为-2的元素。列表的最后一个元素的位置下标是-1,因此-2是指倒数第二个元素,即4。
  16. nebula> RETURN range(1,5)[-2];
  17. +------------------+
  18. | range(1,5)[-(2)] |
  19. +------------------+
  20. | 4 |
  21. +------------------+
  22. # 返回列表[1,2,3,4,5]中位置下标大于2的元素。
  23. nebula> RETURN [n IN range(1,5) WHERE n > 2] AS a;
  24. +-----------+
  25. | a |
  26. +-----------+
  27. | [3, 4, 5] |
  28. +-----------+
  29. # 筛选列表[1,2,3,4,5]中位置下标大于2的元素,将这些元素分别做运算并返回。
  30. nebula> RETURN [n IN range(1,5) WHERE n > 2 | n + 10] AS a;
  31. +--------------+
  32. | a |
  33. +--------------+
  34. | [13, 14, 15] |
  35. +--------------+
  36. # 将列表[1,2,3,4,5]中的元素分别做运算,然后返回。
  37. nebula> RETURN [n IN range(1,5) | n + 10] AS a;
  38. +----------------------+
  39. | a |
  40. +----------------------+
  41. | [11, 12, 13, 14, 15] |
  42. +----------------------+
  43. # 将列表[1,2,3,4,5]中的元素分别做运算,然后将列表去掉表头并返回。
  44. nebula> RETURN tail([n IN range(1, 5) | 2 * n - 10]) AS a;
  45. +-----------------+
  46. | a |
  47. +-----------------+
  48. | [-6, -4, -2, 0] |
  49. +-----------------+
  50. # 将列表[1,2,3]中的元素判断为真,然后返回。
  51. nebula> RETURN [n IN range(1, 3) WHERE true | n] AS r;
  52. +-----------+
  53. | r |
  54. +-----------+
  55. | [1, 2, 3] |
  56. +-----------+
  57. # 返回列表[1,2,3]的长度。
  58. nebula> RETURN size([1,2,3]);
  59. +---------------+
  60. | size([1,2,3]) |
  61. +---------------+
  62. | 3 |
  63. +---------------+
  64. # 将列表[92,90]中的元素做运算,然后在where子句中进行条件判断。
  65. nebula> GO FROM "player100" OVER follow WHERE follow.degree NOT IN [x IN [92, 90] | x + $$.player.age] \
  66. YIELD follow._dst AS id, follow.degree AS degree;
  67. +-------------+--------+
  68. | id | degree |
  69. +-------------+--------+
  70. | "player101" | 95 |
  71. +-------------+--------+
  72. | "player102" | 90 |
  73. +-------------+--------+
  74. # 将MATCH语句的查询结果作为列表中的元素进行运算并返回。
  75. nebula> MATCH p = (n:player{name:"Tim Duncan"})-[:follow]->(m) \
  76. RETURN [n IN nodes(p) | n.age + 100] AS r;
  77. +------------+
  78. | r |
  79. +------------+
  80. | [142, 136] |
  81. +------------+
  82. | [142, 133] |
  83. +------------+

OpenCypher兼容性

  • 复合数据类型(例如set、map、list)不能存储为点或边的属性。

  • 不支持使用range()函数返回一个列表的部分元素。

    1. nebula> RETURN range(0,5)[0..3];
    2. [ERROR (-7)]: SyntaxError: syntax error near `3]'
  • 在openCypher中,查询越界元素时返回null,而在nGQL中,查询越界元素时返回OUT_OF_RANGE

    1. nebula> RETURN range(0,5)[-12];
    2. +-------------------+
    3. | range(0,5)[-(12)] |
    4. +-------------------+
    5. | OUT_OF_RANGE |
    6. +-------------------+