LOOKUP

LOOKUP根据索引遍历数据。用户可以使用LOOKUP实现如下功能:

  • 根据WHERE子句搜索特定数据。

  • 通过Tag列出点:检索指定Tag的所有点ID。

  • 通过Edge type列出边:检索指定Edge type的所有边的起始点、目的点和rank。

  • 统计包含指定Tag的点或属于指定Edge type的边的数量。

OpenCypher兼容性

本文操作仅适用于原生nGQL。

注意事项

  • 索引会导致写性能大幅降低(降低90%甚至更多)。请不要随意在生产环境中使用索引,除非很清楚使用索引对业务的影响。

  • 如果用LOOKUP语句基于指定属性查询时该属性没有索引,系统会在可用的索引中随机选择一个。

    例如,Tag player 有属性 nameage,Tag player 本身和属性 name 有索引,而属性 age 没有索引。当运行 LOOKUP ON player WHERE player.age == 36 YIELD player.name; 时,系统会在 Tag player 和属性 name 的索引中随机使用一个。

    历史版本兼容性

    在此前的版本中,如果用LOOKUP语句基于指定属性查询时该属性没有索引,系统将报错,而不会使用其它索引。

前提条件

请确保LOOKUP语句有至少一个索引可用。如果需要创建索引,但是已经有相关的点、边或属性,用户必须在创建索引后重建索引,才能使其生效。

语法

  1. LOOKUP ON {<vertex_tag> | <edge_type>}
  2. [WHERE <expression> [AND <expression> ...]]
  3. [YIELD <return_list> [AS <alias>]];
  4. <return_list>
  5. <prop_name> [AS <col_alias>] [, <prop_name> [AS <prop_alias>] ...];
  • WHERE <expression>:指定遍历的过滤条件,还可以结合布尔运算符AND和OR一起使用。详情请参见WHERE

  • YIELD:定义需要返回的输出。

    • LOOKUPTag时,除了返回定义的属性,额外返回VertexID。如果没有YIELD子句,返回VertexID
    • LOOKUPEdge type时,除了返回定义的属性,额外返回起始点ID目的点IDrank。如果没有YIELD子句,返回起始点ID目的点IDrank
  • AS:设置别名。

WHERE语句限制

LOOKUP语句中使用WHERE子句,不支持如下操作:

  • $-$^
  • 在关系表达式中,不支持运算符两边都有字段名,例如tagName.prop1 > tagName.prop2
  • 不支持运算表达式和函数表达式中嵌套AliasProp表达式。
  • 不支持XOR和NOT运算符。
  • 不支持除STARTS WITH之外的字符串操作。

检索点

返回Tag为playernameTony Parker的点。

  1. nebula> CREATE TAG INDEX index_player ON player(name(30), age);
  2. nebula> REBUILD TAG INDEX index_player;
  3. +------------+
  4. | New Job Id |
  5. +------------+
  6. | 15 |
  7. +------------+
  8. nebula> LOOKUP ON player \
  9. WHERE player.name == "Tony Parker";
  10. +-------------+
  11. | VertexID |
  12. +-------------+
  13. | "player101" |
  14. +-------------+
  15. nebula> LOOKUP ON player \
  16. WHERE player.name == "Tony Parker" \
  17. YIELD properties(vertex).name AS name, properties(vertex).age AS age;
  18. +-------------+---------------+-----+
  19. | VertexID | name | age |
  20. +-------------+---------------+-----+
  21. | "player101" | "Tony Parker" | 36 |
  22. +-------------+---------------+-----+
  23. nebula> LOOKUP ON player \
  24. WHERE player.age > 45;
  25. +-------------+
  26. | VertexID |
  27. +-------------+
  28. | "player140" |
  29. | "player144" |
  30. +-------------+
  31. nebula> LOOKUP ON player \
  32. WHERE player.name STARTS WITH "B" \
  33. AND player.age IN [22,30] \
  34. YIELD properties(vertex).name, properties(vertex).age;
  35. +-------------+-------------------------+------------------------+
  36. | VertexID | properties(VERTEX).name | properties(VERTEX).age |
  37. +-------------+-------------------------+------------------------+
  38. | "player134" | "Blake Griffin" | 30 |
  39. | "player149" | "Ben Simmons" | 22 |
  40. +-------------+-------------------------+------------------------+
  41. nebula> LOOKUP ON player \
  42. WHERE player.name == "Kobe Bryant"\
  43. YIELD properties(vertex).name AS name |\
  44. GO FROM $-.VertexID OVER serve \
  45. YIELD $-.name, properties(edge).start_year, properties(edge).end_year, properties($$).name;
  46. +---------------+-----------------------------+---------------------------+---------------------+
  47. | $-.name | properties(EDGE).start_year | properties(EDGE).end_year | properties($$).name |
  48. +---------------+-----------------------------+---------------------------+---------------------+
  49. | "Kobe Bryant" | 1996 | 2016 | "Lakers" |
  50. +---------------+-----------------------------+---------------------------+---------------------+

检索边

返回Edge type为followdegree90的边。

  1. nebula> CREATE EDGE INDEX index_follow ON follow(degree);
  2. nebula> REBUILD EDGE INDEX index_follow;
  3. +------------+
  4. | New Job Id |
  5. +------------+
  6. | 62 |
  7. +------------+
  8. nebula> LOOKUP ON follow \
  9. WHERE follow.degree == 90;
  10. +-------------+-------------+---------+
  11. | SrcVID | DstVID | Ranking |
  12. +-------------+-------------+---------+
  13. | "player150" | "player143" | 0 |
  14. | "player150" | "player137" | 0 |
  15. | "player148" | "player136" | 0 |
  16. ...
  17. nebula> LOOKUP ON follow \
  18. WHERE follow.degree == 90 \
  19. YIELD properties(edge).degree;
  20. +-------------+-------------+---------+-------------------------+
  21. | SrcVID | DstVID | Ranking | properties(EDGE).degree |
  22. +-------------+-------------+---------+-------------------------+
  23. | "player150" | "player143" | 0 | 90 |
  24. | "player150" | "player137" | 0 | 90 |
  25. | "player148" | "player136" | 0 | 90 |
  26. ...
  27. nebula> LOOKUP ON follow \
  28. WHERE follow.degree == 60 \
  29. YIELD properties(edge).degree AS Degree |\
  30. GO FROM $-.DstVID OVER serve \
  31. YIELD $-.DstVID, properties(edge).start_year, properties(edge).end_year, properties($$).name;
  32. +-------------+------------------+----------------+--------------+
  33. | $-.DstVID | serve.start_year | serve.end_year | $$.team.name |
  34. +-------------+------------------+----------------+--------------+
  35. | "player105" | 2010 | 2018 | "Spurs" |
  36. | "player105" | 2009 | 2010 | "Cavaliers" |
  37. | "player105" | 2018 | 2019 | "Raptors" |
  38. +-------------+------------------+----------------+--------------+

通过Tag列出所有的对应的点/通过Edge type列出边

如果需要通过Tag列出所有的点,或通过Edge type列出边,则Tag、Edge type或属性上必须有至少一个索引。

例如一个Tag player有属性nameage,为了遍历所有包含Tag player的点ID,Tag player、属性name或属性age中必须有一个已经创建索引。

  • 查找所有Tag为player的点 VID。

    1. nebula> CREATE TAG player(name string,age int);
    2. nebula> CREATE TAG INDEX player_index on player();
    3. nebula> REBUILD TAG INDEX player_index;
    4. +------------+
    5. | New Job Id |
    6. +------------+
    7. | 66 |
    8. +------------+
    9. nebula> INSERT VERTEX player(name,age) \
    10. VALUES "player100":("Tim Duncan", 42), "player101":("Tony Parker", 36);
    11. # 列出所有的 player。类似于 MATCH (n:player) RETURN id(n) /*, n */。
    12. nebula> LOOKUP ON player;
    13. +-------------+
    14. | VertexID |
    15. +-------------+
    16. | "player100" |
    17. | "player101" |
    18. +-------------+
  • 查找Edge type为follow的所有边的信息。

    1. nebula> CREATE EDGE follow(degree int);
    2. nebula> CREATE EDGE INDEX follow_index on follow();
    3. nebula> REBUILD EDGE INDEX follow_index;
    4. +------------+
    5. | New Job Id |
    6. +------------+
    7. | 88 |
    8. +------------+
    9. nebula> INSERT EDGE follow(degree) \
    10. VALUES "player100"->"player101":(95);
    11. # 列出所有的 follow 边。类似于 MATCH (s)-[e:follow]->(d) RETURN id(s), rank(e), id(d) /*, type(e) */。
    12. nebula)> LOOKUP ON follow;
    13. +-------------+-------------+---------+
    14. | SrcVID | DstVID | Ranking |
    15. +-------------+-------------+---------+
    16. | "player100" | "player101" | 0 |
    17. +-------------+-------------+---------+

统计点或边

统计Tag为player的点和Edge type为follow的边。

  1. nebula> LOOKUP ON player |\
  2. YIELD COUNT(*) AS Player_Number;
  3. +---------------+
  4. | Player_Number |
  5. +---------------+
  6. | 51 |
  7. +---------------+
  8. nebula> LOOKUP ON follow | \
  9. YIELD COUNT(*) AS Follow_Number;
  10. +---------------+
  11. | Follow_Number |
  12. +---------------+
  13. | 81 |
  14. +---------------+

Note

使用SHOW STATS命令也可以统计点和边。


最后更新: November 1, 2021