LOOKUP

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

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

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

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

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

    注意事项

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

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

      历史版本兼容性

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

    前提条件

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

    • WHERE <expression>:指定遍历的过滤条件,还可以结合布尔运算符AND和OR一起使用。详情请参见。

    • 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之外的字符串操作。

    检索点

    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. +-------------+
    10. | VertexID |
    11. +-------------+
    12. +-------------+
    13. nebula> LOOKUP ON player \
    14. WHERE player.name == "Tony Parker" \
    15. YIELD properties(vertex).name AS name, properties(vertex).age AS age;
    16. +-------------+---------------+-----+
    17. | VertexID | name | age |
    18. +-------------+---------------+-----+
    19. | "player101" | "Tony Parker" | 36 |
    20. +-------------+---------------+-----+
    21. nebula> LOOKUP ON player \
    22. WHERE player.age > 45;
    23. +-------------+
    24. | VertexID |
    25. +-------------+
    26. | "player140" |
    27. | "player144" |
    28. +-------------+
    29. nebula> LOOKUP ON player \
    30. WHERE player.name STARTS WITH "B" \
    31. AND player.age IN [22,30] \
    32. YIELD properties(vertex).name, properties(vertex).age;
    33. +-------------+-------------------------+------------------------+
    34. | VertexID | properties(VERTEX).name | properties(VERTEX).age |
    35. +-------------+-------------------------+------------------------+
    36. | "player134" | "Blake Griffin" | 30 |
    37. | "player149" | "Ben Simmons" | 22 |
    38. +-------------+-------------------------+------------------------+
    39. nebula> LOOKUP ON player \
    40. WHERE player.name == "Kobe Bryant"\
    41. YIELD properties(vertex).name AS name |\
    42. GO FROM $-.VertexID OVER serve \
    43. YIELD $-.name, properties(edge).start_year, properties(edge).end_year, properties($$).name;
    44. +---------------+-----------------------------+---------------------------+---------------------+
    45. | $-.name | properties(EDGE).start_year | properties(EDGE).end_year | properties($$).name |
    46. +---------------+-----------------------------+---------------------------+---------------------+
    47. +---------------+-----------------------------+---------------------------+---------------------+

    返回Edge type为followdegree90的边。

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

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

    例如一个Tag 有属性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的所有边的信息。

    统计点或边

    统计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. +---------------+

    Note