FETCH

FETCH可以获取指定点或边的属性值。

openCypher兼容性

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

获取点的属性值

语法

  1. FETCH PROP ON {<tag_name>[, tag_name ...] | *}
  2. <vid> [, vid ...]
  3. [YIELD <return_list> [AS <alias>]];
参数说明
tagnameTag名称。
*表示当前图空间中的所有Tag。
vid点ID。
YIELD定义需要返回的输出。除了返回定义的属性,额外返回VertexID。详情请参见YIELD。如果没有YIELD子句,默认返回vertices,包含点的所有信息。
AS设置别名。

基于Tag获取点的属性值

FETCH语句中指定Tag获取对应点的属性值。

  1. nebula> FETCH PROP ON player "player100";
  2. +----------------------------------------------------+
  3. | vertices_ |
  4. +----------------------------------------------------+
  5. | ("player100" :player{age: 42, name: "Tim Duncan"}) |
  6. +----------------------------------------------------+

获取点的指定属性值

使用YIELD子句指定返回的属性。

  1. nebula> FETCH PROP ON player "player100" \
  2. YIELD properties(vertex).name AS name;
  3. +-------------+--------------+
  4. | VertexID | name |
  5. +-------------+--------------+
  6. | "player100" | "Tim Duncan" |
  7. +-------------+--------------+

获取多个点的属性值

指定多个点ID获取多个点的属性值,点之间用英文逗号(,)分隔。

  1. nebula> FETCH PROP ON player "player101", "player102", "player103";
  2. +-----------------------------------------------------------+
  3. | vertices_ |
  4. +-----------------------------------------------------------+
  5. | ("player101" :player{age: 36, name: "Tony Parker"}) |
  6. | ("player102" :player{age: 33, name: "LaMarcus Aldridge"}) |
  7. | ("player103" :player{age: 32, name: "Rudy Gay"}) |
  8. +-----------------------------------------------------------+

基于多个Tag获取点的属性值

FETCH语句中指定多个Tag获取属性值。Tag之间用英文逗号(,)分隔。

  1. # 创建新Tag t1。
  2. nebula> CREATE TAG t1(a string, b int);
  3. # 为点player100添加Tag t1。
  4. nebula> INSERT VERTEX t1(a, b) VALUE "player100":("Hello", 100);
  5. # 基于Tag player和t1获取点player100上的属性值。
  6. nebula> FETCH PROP ON player, t1 "player100";
  7. +----------------------------------------------------------------------------+
  8. | vertices_ |
  9. +----------------------------------------------------------------------------+
  10. | ("player100" :t1{a: "Hello", b: 100} :player{age: 42, name: "Tim Duncan"}) |
  11. +----------------------------------------------------------------------------+

用户可以在FETCH语句中组合多个Tag和多个点。

  1. nebula> FETCH PROP ON player, t1 "player100", "player103";
  2. +----------------------------------------------------------------------------+
  3. | vertices_ |
  4. +----------------------------------------------------------------------------+
  5. | ("player100" :t1{a: "Hello", b: 100} :player{age: 42, name: "Tim Duncan"}) |
  6. | ("player103" :player{age: 32, name: "Rudy Gay"}) |
  7. +----------------------------------------------------------------------------+

在所有标签中获取点的属性值

FETCH语句中使用*获取当前图空间所有标签里,点的属性值。

  1. nebula> FETCH PROP ON * "player100", "player106", "team200";
  2. +----------------------------------------------------------------------------+
  3. | vertices_ |
  4. +----------------------------------------------------------------------------+
  5. | ("player106" :player{age: 25, name: "Kyle Anderson"}) |
  6. | ("team200" :team{name: "Warriors"}) |
  7. | ("player100" :t1{a: "Hello", b: 100} :player{age: 42, name: "Tim Duncan"}) |
  8. +----------------------------------------------------------------------------+

获取边的属性值

语法

  1. FETCH PROP ON <edge_type> <src_vid> -> <dst_vid>[@<rank>] [, <src_vid> -> <dst_vid> ...]
  2. [YIELD <output>]
参数说明
edgetypeEdge type名称。
src_vid起始点ID,表示边的起点。
dst_vid目的点ID,表示边的终点。
rank边的rank。可选参数,默认值为0。起始点、目的点、Edge type和rank可以唯一确定一条边。
YIELD定义需要返回的输出。除了返回定义的属性,额外返回起始点ID目的点IDrank。详情请参见YIELD。如果没有YIELD子句,默认返回edges,包含边的所有信息。

获取边的所有属性值

  1. # 获取连接player100和team204的边serve的所有属性值。
  2. nebula> FETCH PROP ON serve "player100" -> "team204";
  3. +-----------------------------------------------------------------------+
  4. | edges_ |
  5. +-----------------------------------------------------------------------+
  6. | [:serve "player100"->"team204" @0 {end_year: 2016, start_year: 1997}] |
  7. +-----------------------------------------------------------------------+

获取边的指定属性值

使用YIELD子句指定返回的属性。

  1. nebula> FETCH PROP ON serve "player100" -> "team204" \
  2. YIELD properties(edge).start_year;
  3. +-------------+------------+-------------+-----------------------------+
  4. | serve._src | serve._dst | serve._rank | properties(EDGE).start_year |
  5. +-------------+------------+-------------+-----------------------------+
  6. | "player100" | "team204" | 0 | 1997 |
  7. +-------------+------------+-------------+-----------------------------+

获取多条边的属性值

指定多个边模式(<src_vid> -> <dst_vid>[@<rank>])获取多个边的属性值。模式之间用英文逗号(,)分隔。

  1. nebula> FETCH PROP ON serve "player100" -> "team204", "player133" -> "team202";
  2. +-----------------------------------------------------------------------+
  3. | edges_ |
  4. +-----------------------------------------------------------------------+
  5. | [:serve "player100"->"team204" @0 {end_year: 2016, start_year: 1997}] |
  6. | [:serve "player133"->"team202" @0 {end_year: 2011, start_year: 2002}] |
  7. +-----------------------------------------------------------------------+

基于rank获取属性值

如果有多条边,起始点、目的点和Edge type都相同,可以通过指定rank获取正确的边属性值。

  1. # 插入不同属性值、不同rank的边。
  2. nebula> insert edge serve(start_year,end_year) \
  3. values "player100"->"team204"@1:(1998, 2017);
  4. nebula> insert edge serve(start_year,end_year) \
  5. values "player100"->"team204"@2:(1990, 2018);
  6. # 默认返回rank为0的边。
  7. nebula> FETCH PROP ON serve "player100" -> "team204";
  8. +-----------------------------------------------------------------------+
  9. | edges_ |
  10. +-----------------------------------------------------------------------+
  11. | [:serve "player100"->"team204" @0 {end_year: 2016, start_year: 1997}] |
  12. +-----------------------------------------------------------------------+
  13. # 要获取rank不为0的边,请在FETCH语句中设置rank。
  14. nebula> FETCH PROP ON serve "player100" -> "team204"@1;
  15. +-----------------------------------------------------------------------+
  16. | edges_ |
  17. +-----------------------------------------------------------------------+
  18. | [:serve "player100"->"team204" @1 {end_year: 2017, start_year: 1998}] |
  19. +-----------------------------------------------------------------------+

复合语句中使用FETCH

FETCH与原生nGQL结合使用是一种常见的方式,例如和GO一起。

  1. # 返回从点player101开始的follow边的degree值。
  2. nebula> GO FROM "player101" OVER follow \
  3. YIELD src(edge) AS s, dst(edge) AS d \
  4. | FETCH PROP ON follow $-.s -> $-.d \
  5. YIELD properties(edge).degree;
  6. +-------------+-------------+--------------+-------------------------+
  7. | follow._src | follow._dst | follow._rank | properties(EDGE).degree |
  8. +-------------+-------------+--------------+-------------------------+
  9. | "player101" | "player100" | 0 | 95 |
  10. | "player101" | "player102" | 0 | 90 |
  11. | "player101" | "player125" | 0 | 95 |
  12. +-------------+-------------+--------------+-------------------------+

用户也可以通过自定义变量构建类似的查询。

  1. nebula> $var = GO FROM "player101" OVER follow \
  2. YIELD src(edge) AS s, dst(edge) AS d; \
  3. FETCH PROP ON follow $var.s -> $var.d \
  4. YIELD properties(edge).degree;
  5. +-------------+-------------+--------------+-------------------------+
  6. | follow._src | follow._dst | follow._rank | properties(EDGE).degree |
  7. +-------------+-------------+--------------+-------------------------+
  8. | "player101" | "player100" | 0 | 95 |
  9. | "player101" | "player102" | 0 | 90 |
  10. | "player101" | "player125" | 0 | 95 |
  11. +-------------+-------------+--------------+-------------------------+

更多复合语句的详情,请参见复合查询(子句结构)


最后更新: October 27, 2021