跳转至

LOOKUPGraph

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

  • 根据WHERE子句搜索特定数据。
  • 通过标签列出点: 检索指定标签的所有点ID。
  • 通过边类型列出边:检索指定边类型的所有边的起始点、目的点和rank。
  • 计数指定标签的点或指定边类型的边。

openCypher兼容性Graph

本文操作仅适用于nGQL扩展。

前提条件Graph

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

警告:正确使用索引可以加快查询速度,但是索引会导致写性能大幅降低(降低90%甚至更多)。请不要随意在生产环境中使用索引,除非很清楚使用索引对业务的影响。

语法Graph

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

<return_list>
    <prop_name> [AS <col_alias>] [, <prop_name> [AS <prop_alias>] ...];
  • WHERE <expression>:指定遍历的过滤条件,还可以结合AND、OR一起使用。详情请参见Graph。
  • YIELD <return_list>:指定要返回的结果和格式.
  • 如果只有WHERE子句,没有YIELD子句:
    • LOOKUP标签时,返回点ID。
    • LOOKUP边类型时,返回起始点ID、目的点ID和rank。

WHERE语句限制Graph

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

  • $-$^
  • 在关系表达式中,不支持运算符两边都有字段名,例如tagName.prop1> tagName.prop2
  • 不支持运算表达式和函数表达式中嵌套AliasProp表达式。
  • 不支持 starts with ends with contains 等字符串索引模糊查询操作
  • 不支持ORXOR运算符。

检索点Graph

返回标签为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 |
============
| 101      |
------------

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

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       |
------------------------------------------------------------------

检索边Graph

返回边类型为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 |
=============================
| 100    | 106    | 0       |
-----------------------------

nebula> LOOKUP ON follow WHERE follow.degree == 90 YIELD follow.degree;
=============================================
| SrcVID | DstVID | Ranking | follow.degree |
=============================================
| 100    | 106    | 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 |
================================================================
| 105       | 2010             | 2018           | Spurs        |
----------------------------------------------------------------
| 105       | 2009             | 2010           | Cavaliers    |
----------------------------------------------------------------
| 105       | 2018             | 2019           | Raptors      |
----------------------------------------------------------------

通过标签列出所有的对应的点/通过边类型列出边Graph

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

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

  • 查找所有标签为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;
    +-------------+
    | _vid        |
    +-------------+
    | "player100" |
    +-------------+
    | "player101" |
    +-------------+
    
  • 查找边类型为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;
    +-------------+----------+-------------+
    | _src        | _ranking | _dst        |
    +-------------+----------+-------------+
    | "player100" | 0        | "player101" |
    +-------------+----------+-------------+
    

统计点或边Graph

统计标签为player的点和边类型为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           |
+-------------+

用户也可以使用Graph实现类似的功能。


最后更新: 2021年5月20日
Back to top