Skip to content

Latest commit

 

History

History
273 lines (208 loc) · 8.98 KB

File metadata and controls

273 lines (208 loc) · 8.98 KB

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 的索引中随机使用一个。

    !!! compatibility "历史版本兼容性"

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

前提条件

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

语法

LOOKUP ON {<vertex_tag> | <edge_type>} 
[WHERE <expression> [AND <expression> ...]] 
[YIELD <return_list> [AS <alias>]];

<return_list>
    <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的点。

nebula> CREATE TAG INDEX index_player ON player(name(30), age);

nebula> REBUILD TAG INDEX index_player;
+------------+
| New Job Id |
+------------+
| 15         |
+------------+

nebula> LOOKUP ON player \
        WHERE player.name == "Tony Parker";
+-------------+
| VertexID    |
+-------------+
| "player101" |
+-------------+

nebula> LOOKUP ON player \
        WHERE player.name == "Tony Parker" \
        YIELD player.name AS name, player.age AS age;
+-------------+---------------+-----+
| VertexID    | name          | age |
+-------------+---------------+-----+
| "player101" | "Tony Parker" | 36  |
+-------------+---------------+-----+

nebula> LOOKUP ON player \
        WHERE player.age  > 45;
+-------------+
| VertexID    |
+-------------+
| "player144" |
+-------------+
| "player140" |
+-------------+

nebula> LOOKUP ON player \
        WHERE player.name STARTS WITH "B" \
        AND player.age IN [22,30] \
        YIELD player.name, player.age;
+-------------+-----------------+------------+
| VertexID    | player.name     | player.age |
+-------------+-----------------+------------+
| "player149" | "Ben Simmons"   | 22         |
+-------------+-----------------+------------+
| "player134" | "Blake Griffin" | 30         |
+-------------+-----------------+------------+

nebula> LOOKUP ON player \
        WHERE player.name == "Kobe Bryant" \
        YIELD player.name AS name |\
        GO FROM $-.VertexID OVER serve \
        YIELD $-.name, serve.start_year, serve.end_year, $$.team.name;
+---------------+------------------+----------------+--------------+
| $-.name       | serve.start_year | serve.end_year | $$.team.name |
+---------------+------------------+----------------+--------------+
| "Kobe Bryant" | 1996             | 2016           | "Lakers"     |
+---------------+------------------+----------------+--------------+

检索边

返回Edge type为followdegree90的边。

nebula> CREATE EDGE INDEX index_follow ON follow(degree);

nebula> REBUILD EDGE INDEX index_follow;
+------------+
| New Job Id |
+------------+
| 62         |
+------------+

nebula> LOOKUP ON follow \
        WHERE follow.degree == 90;
+-------------+-------------+---------+
| SrcVID      | DstVID      | Ranking |
+-------------+-------------+---------+
| "player101" | "player102" | 0       |
+-------------+-------------+---------+
| "player133" | "player114" | 0       |
+-------------+-------------+---------+
| "player133" | "player144" | 0       |
+-------------+-------------+---------+
...

nebula> LOOKUP ON follow \
        WHERE follow.degree == 90 \
        YIELD follow.degree;
+-------------+-------------+---------+---------------+
| SrcVID      | DstVID      | Ranking | follow.degree |
+-------------+-------------+---------+---------------+
| "player101" | "player102" | 0       | 90            |
+-------------+-------------+---------+---------------+
| "player133" | "player114" | 0       | 90            |
+-------------+-------------+---------+---------------+
| "player133" | "player144" | 0       | 90            |
+-------------+-------------+---------+---------------+
...

nebula> LOOKUP ON follow \
        WHERE follow.degree == 60 \
        YIELD follow.degree AS Degree |\
        GO FROM $-.DstVID OVER serve \
        YIELD $-.DstVID, serve.start_year, serve.end_year, $$.team.name;
+-------------+------------------+----------------+--------------+
| $-.DstVID   | serve.start_year | serve.end_year | $$.team.name |
+-------------+------------------+----------------+--------------+
| "player105" | 2010             | 2018           | "Spurs"      |
+-------------+------------------+----------------+--------------+
| "player105" | 2009             | 2010           | "Cavaliers"  |
+-------------+------------------+----------------+--------------+
| "player105" | 2018             | 2019           | "Raptors"    |
+-------------+------------------+----------------+--------------+

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

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

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

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

    nebula> CREATE TAG player(name string,age int);
    
    nebula> CREATE TAG INDEX player_index on player();
    
    nebula> REBUILD TAG INDEX player_index;
    +------------+
    | New Job Id |
    +------------+
    | 66         |
    +------------+
    
    nebula> INSERT VERTEX player(name,age) \
            VALUES "player100":("Tim Duncan", 42), "player101":("Tony Parker", 36);
     
    # 列出所有的 player。类似于 MATCH (n:player) RETURN id(n) /*, n */。
    
    nebula> LOOKUP ON player;
    +-------------+
    |  VertexID   |
    +-------------+
    | "player100" |
    +-------------+
    | "player101" |
    +-------------+
    
  • 查找Edge type为like的所有边的信息。

    nebula> CREATE EDGE like(likeness int);
    
    nebula> CREATE EDGE INDEX like_index on like();
    
    nebula> REBUILD EDGE INDEX like_index;
    +------------+
    | New Job Id |
    +------------+
    | 88         |
    +------------+
    
    nebula> INSERT EDGE like(likeness) \
            VALUES "player100"->"player101":(95);
    
    # 列出所有的 like 边。类似于 MATCH (s)-[e:like]->(d) RETURN id(s), rank(e), id(d) /*, type(e) */。
    
    nebula)> LOOKUP ON like;
    +-------------+----------+-------------+
    | VertexID    | DstVID   | _dst        |
    +-------------+----------+-------------+
    | "player100" | 0        | "player101" |
    +-------------+----------+-------------+
    

统计点或边

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

nebula> LOOKUP ON player |\
        YIELD COUNT(*) AS Player_Number;
+---------------+
| Player_Number |
+---------------+
| 2             |
+---------------+

nebula> LOOKUP ON like | \
        YIELD COUNT(*) AS Like_Number;
+-------------+
| Like_Number |
+-------------+
| 1           |
+-------------+

!!! note

使用[`show-stats`命令](./6.show/14.show-stats.md)也可以统计点和边。