跳转至

Schema 相关函数

本文介绍 NebulaGraph 支持的 Schema 相关的函数。

Schema 相关的函数分为两类:

原生 nGQL 语句适用

原生 nGQL 语句的YIELDWHERE子句中可以使用如下介绍的函数。

Note

由于 vertex、edge、vertices、edges、path 属于关键字,使用时需要用AS <alias>设置别名才能正常使用。例如GO FROM "player100" OVER follow YIELD edge AS e;

id(vertex)

id(vertex) 返回点 ID。

语法:id(vertex)

  • 返回类型:和点 ID 的类型保持一致。

示例:

nebula> LOOKUP ON player WHERE player.age  > 45 YIELD id(vertex);
+-------------+
| id(VERTEX)  |
+-------------+
| "player144" |
| "player140" |
+-------------+

properties(vertex)

properties(vertex) 返回点的所有属性。

语法:properties(vertex)

  • 返回类型:map。

示例:

nebula> LOOKUP ON player WHERE player.age  > 45 \
        YIELD properties(vertex);
+-------------------------------------+
| properties(VERTEX)                  |
+-------------------------------------+
| {age: 47, name: "Shaquille O'Neal"} |
| {age: 46, name: "Grant Hill"}       |
+-------------------------------------+

用户也可以使用属性引用符($^$$)替代函数properties()中的vertex参数来获取点的所有属性。

  • $^表示探索开始时的点数据。例如GO FROM "player100" OVER follow reversely YIELD properties($^)中,$^player100这个点。
  • $$表示探索结束的终点数据。

properties($^)properties($$)一般用于GO语句中。更多信息,请参见属性引用符

Caution

用户可以通过properties().<property_name>来获取点的指定属性。但是不建议使用这种方式获取指定属性,因为properties()函数返回所有属性,这样会降低查询性能。

properties(edge)

properties(edge) 返回边的所有属性。

语法:properties(edge)

  • 返回类型:map。

示例:

nebula> GO FROM "player100" OVER follow \
        YIELD properties(edge);
+------------------+
| properties(EDGE) |
+------------------+
| {degree: 95}     |
| {degree: 95}     |
+------------------+

Warning

用户可以通过properties(edge).<property_name>来获取边的指定属性。但是不建议使用这种方式获取指定属性,因为properties(edge)函数返回边的所有属性,这样会降低查询性能。

type(edge)

type(edge) 返回边的 Edge type。

语法:type(edge)

  • 返回类型:string。

示例:

nebula> GO FROM "player100" OVER follow \
        YIELD src(edge), dst(edge), type(edge), rank(edge);
+-------------+-------------+------------+------------+
| src(EDGE)   | dst(EDGE)   | type(EDGE) | rank(EDGE) |
+-------------+-------------+------------+------------+
| "player100" | "player101" | "follow"   | 0          |
| "player100" | "player125" | "follow"   | 0          |
+-------------+-------------+------------+------------+

src(edge)

src(edge) 返回边的起始点 ID。

语法:src(edge)

  • 返回类型:和点 ID 的类型保持一致。

示例:

nebula> GO FROM "player100" OVER follow \
        YIELD src(edge), dst(edge);
+-------------+-------------+
| src(EDGE)   | dst(EDGE)   |
+-------------+-------------+
| "player100" | "player101" |
| "player100" | "player125" |
+-------------+-------------+

Note

src(edge) 和 properties($^) 查找起始点的语义不同。src(edge) 始终表示图数据库中边的起始点 ID,而 properties($^) 表示探索开始时的点数据,例如示例中GO FROM "player100"player100这个点的数据。

dst(edge)

dst(edge) 返回边的目的点 ID。

语法:dst(edge)

  • 返回类型:和点 ID 的类型保持一致。

示例:

nebula> GO FROM "player100" OVER follow \
        YIELD src(edge), dst(edge);
+-------------+-------------+
| src(EDGE)   | dst(EDGE)   |
+-------------+-------------+
| "player100" | "player101" |
| "player100" | "player125" |
+-------------+-------------+

Note

dst(edge) 始终表示图数据库中边的目的点 ID。

rank(edge)

rank(edge) 返回边的 rank。

语法:rank(edge)

  • 返回类型:int。

示例:

nebula> GO FROM "player100" OVER follow \
        YIELD src(edge), dst(edge), rank(edge);
+-------------+-------------+------------+
| src(EDGE)   | dst(EDGE)   | rank(EDGE) |
+-------------+-------------+------------+
| "player100" | "player101" | 0          |
| "player100" | "player125" | 0          |
+-------------+-------------+------------+

vertex

vertex 返回点的信息。包括点 ID、Tag、属性和值。需要用AS <alias>设置别名。

语法:vertex

示例:

nebula> LOOKUP ON player WHERE player.age  > 45 YIELD vertex AS v;
+----------------------------------------------------------+
| v                                                        |
+----------------------------------------------------------+
| ("player144" :player{age: 47, name: "Shaquille O'Neal"}) |
| ("player140" :player{age: 46, name: "Grant Hill"})       |
+----------------------------------------------------------+

edge

edge 返回边的信息。包括 Edge type、起始点 ID、目的点 ID、rank、属性和值。需要用AS <alias>设置别名。

语法:edge

示例:

nebula> GO FROM "player100" OVER follow YIELD edge AS e;
+----------------------------------------------------+
| e                                                  |
+----------------------------------------------------+
| [:follow "player100"->"player101" @0 {degree: 95}] |
| [:follow "player100"->"player125" @0 {degree: 95}] |
+----------------------------------------------------+

vertices

vertices 返回子图中的点的信息。详情参见 GET SUBGRAPH

edges

edges 返回子图中的边的信息。详情参见 GET SUBGRAPH

path

path 返回路径信息。详情参见 FIND PATH

openCypher 兼容语句适用

openCypher 兼容语句的RETURNWHERE子句中可以使用如下介绍的函数。

id()

id() 返回点 ID。

语法:id(<vertex>)

  • 返回类型:和点 ID 的类型保持一致。

示例:

nebula> MATCH (v:player) RETURN id(v); 
+-------------+
| id(v)       |
+-------------+
| "player129" |
| "player115" |
| "player106" |
| "player102" |
...

tags() 和labels()

tags() 和labels() 返回点的 Tag。

语法:tags(<vertex>)labels(<vertex>)

  • 返回类型:list。

示例:

nebula> MATCH (v) WHERE id(v) == "player100" \
        RETURN tags(v);
+------------+
| tags(v)    |
+------------+
| ["player"] |
+------------+

properties()

properties() 返回点或边的所有属性。

语法:properties(<vertex_or_edge>)

  • 返回类型:map。

示例:

nebula> MATCH (v:player)-[e:follow]-() RETURN properties(v),properties(e);
+---------------------------------------+---------------+
| properties(v)                         | properties(e) |
+---------------------------------------+---------------+
| {age: 31, name: "Stephen Curry"}      | {degree: 90}  |
| {age: 47, name: "Shaquille O'Neal"}   | {degree: 100} |
| {age: 34, name: "LeBron James"}       | {degree: 13}  |
...

type()

type() 返回边的 Edge type。

语法:type(<edge>)

  • 返回类型:string。

示例:

nebula> MATCH (v:player{name:"Tim Duncan"})-[e]->() \
        RETURN type(e);
+----------+
| type(e)  |
+----------+
| "serve"  |
| "follow" |
| "follow" |
+----------+

typeid()

typeid() 返回边的 Edge type 的内部 ID 值,可以用正负来判断方向。

语法:typeid(<edge>)

  • 返回类型:int。

示例:

nebula> MATCH (v:player)-[e:follow]-(v2) RETURN e,typeid(e), \
        CASE WHEN typeid(e) > 0 \
        THEN "正向" ELSE "反向" END AS direction \
        LIMIT 5;
+----------------------------------------------------+-----------+-----------+
| e                                                  | typeid(e) | direction |
+----------------------------------------------------+-----------+-----------+
| [:follow "player127"->"player114" @0 {degree: 90}] | 5         | "正向"    |
| [:follow "player127"->"player148" @0 {degree: 70}] | 5         | "正向"    |
| [:follow "player148"->"player127" @0 {degree: 80}] | -5        | "反向"    |
| [:follow "player147"->"player136" @0 {degree: 90}] | 5         | "正向"    |
| [:follow "player136"->"player147" @0 {degree: 90}] | -5        | "反向"    |
+----------------------------------------------------+-----------+-----------+

src()

src() 返回边的起始点 ID。

语法:src(<edge>)

  • 返回类型:和点 ID 的类型保持一致。

示例:

nebula> MATCH ()-[e]->(v:player{name:"Tim Duncan"}) \
        RETURN src(e);
+-------------+
| src(e)      |
+-------------+
| "player125" |
| "player113" |
| "player102" |
...

dst()

dst() 返回边的目的点 ID。

语法:dst(<edge>)

  • 返回类型:和点 ID 的类型保持一致。

示例:

nebula> MATCH (v:player{name:"Tim Duncan"})-[e]->() \
        RETURN dst(e);
+-------------+
| dst(e)      |
+-------------+
| "team204"   |
| "player101" |
| "player125" |
+-------------+

startNode()

startNode() 获取一条路径并返回它的起始点信息,包括点 ID、Tag、属性和值。

语法:startNode(<path>)

示例:

nebula> MATCH p = (a :player {name : "Tim Duncan"})-[r:serve]-(t) \
        RETURN startNode(p);
+----------------------------------------------------+
| startNode(p)                                       |
+----------------------------------------------------+
| ("player100" :player{age: 42, name: "Tim Duncan"}) |
+----------------------------------------------------+

endNode()

endNode() 获取一条路径并返回它的目的点信息,包括点 ID、Tag、属性和值。

语法:endNode(<path>)

示例:

nebula> MATCH p = (a :player {name : "Tim Duncan"})-[r:serve]-(t) \
        RETURN endNode(p);
+----------------------------------+
| endNode(p)                       |
+----------------------------------+
| ("team204" :team{name: "Spurs"}) |
+----------------------------------+

rank()

rank() 返回边的 rank。

语法:rank(<edge>)

  • 返回类型:int。

示例:

nebula> MATCH (v:player{name:"Tim Duncan"})-[e]->() \
        RETURN rank(e);
+---------+
| rank(e) |
+---------+
| 0       |
| 0       |
| 0       |
+---------+

最后更新: 2024年9月14日