Nebula基础的查询操作介绍
Nebula基础的查询操作介绍
这里只是对Nebula基础查询进行介绍,其目的是为了让未接触过Nebula的同学最短时间了解其语句。更详细更准确的内可以查看官方文档。 docs.nebula-graph
关于查询这里并没有使用官方例子数据,而是自己实际尝试了文档中的语句。
其他内容
Nebula基础的操作介绍
数据准备
创建标签
CREATE TAG Person(name string, age int, type string);
CREATE TAG Employee(workingAge int);
创建边类型
CREATE EDGE FRIEND(year int);
CREATE EDGE SUBORDINATE();
创建带标签的点
INSERT VERTEX Person(name, age, type) VALUES
"5":("小明", 40, "领导"),
"17":("小静", 45, "领导"),
... (省略其他插入语句)
插入SUBORDINATE边类型
INSERT EDGE SUBORDINATE() VALUES "7"->"1"@0:(), "7"->"3"@0:(), "7"->"4"@0:(), "7"->"6"@0:(), "7"->"8"@0:() ;
... (省略其他插入语句)
插入FRIEND边类型
INSERT EDGE FRIEND(year) VALUES
"1"->"2"@0:( 5),
"2"->"3"@0:( 3),
"3"->"4"@0:( 3),
... (省略其他插入语句)
创建索引
CREATE TAG INDEX Person_index on Person();
CREATE TAG INDEX Employee_index on Employee();CREATE TAG INDEX Person_index_1 on Person(name(10), age, type(10));
CREATE TAG INDEX Employee_index_1 on Employee(workingAge);CREATE EDGE INDEX FRIEND_index on FRIEND(year);
CREATE EDGE INDEX SUBORDINATE_index on SUBORDINATE();
重建索引数据
REBUILD TAG INDEX Person_index,Employee_index;REBUILD TAG INDEX Employee_index_1,Person_index_1;REBUILD EDGE INDEX FRIEND_index,SUBORDINATE_index;
确定重建状态
SHOW TAG INDEX STATUS;
一些变量说明
下面查询中一些变量的说明
起始点
$^.<tag_name>.<prop_name>
$^
: 表示起始点。<tag_name>
: 表示点的 Tag 名称。<prop_name>
: 表示 Tag 内的属性名称。
目的点
$$.<tag_name>.<prop_name>
$$
: 表示目的点。<tag_name>
: 表示点的 Tag 名称。<prop_name>
: 表示 Tag 内的属性名称。
查询语句 - MATCH
MATCH语句提供基于模式(Pattern)匹配的搜索功能。在进行查询时,MATCH语句使用的路径类型是trail,这意味着点可以重复出现,但边不能重复。
需要注意,我这里使用的是3.0.0版本。在EDGE和TAG操作中需要创建索引
匹配点
匹配所有点
# 在数据库中匹配所有节点,然后返回前 5 个节点
MATCH (v) RETURN v LIMIT 5;# 返回结果
("1" :Person{age: 30, name: "张三", type: "员工"})
("13" :Person{age: 28, name: "小丽", type: "员工"})
("16" :Person{age: 22, name: "小敏", type: "员工"})
("20" :Person{age: 22, name: "小明", type: "员工"})
("8" :Person{age: 33, name: "小花", type: "员工"})
匹配 Tag
匹配单个标签
# 在数据库中匹配具有 "Person" 标签的节点
MATCH (v:Person) RETURN v LIMIT 3;# 返回结果
("1" :Person{age: 30, name: "张三", type: "员工"})
("13" :Person{age: 28, name: "小丽", type: "员工"})
("8" :Person{age: 33, name: "小花", type: "员工"})
匹配多个标签
# 在数据库中匹配同时具有 "Person" 和 "Employee" 标签的节点
MATCH (v:Person:Employee) RETURN v LIMIT 2;# 返回结果
("2" :Employee{workingAge: 4} :Person{age: 35, name: "李四", type: "领导"})
("7" :Employee{workingAge: 2} :Person{age: 45, name: "小李", type: "领导"})
匹配点的属性
需要注意:
- NebulaGraph 3.0.0 之前,匹配 Tag 的前提是 Tag 本身有索引或者 Tag 的某个属性有索引。
- NebulaGraph 3.0.0 开始,匹配 Tag 可以不创建索引,但需要使用 LIMIT 限制输出结果数量。
- NebulaGraph 3.5.0 开始,MATCH 语句支持全表扫描,无需为 Tag 或 Tag 的某个属性创建索引,或者使用 LIMIT 限制输出结果数量,即可执行 MATCH 语句。
MATCH 匹配标签属性
# 在数据库中匹配具有 "Person" 标签且属性 "age" 为 35 的节点
MATCH (v:Person{age: 35}) RETURN v LIMIT 2;# 返回结果
("12" :Person{age: 35, name: "小杨", type: "领导"})
("2" :Employee{workingAge: 4} :Person{age: 35, name: "李四", type: "领导"})
WHERE 匹配标签属性
#
MATCH (v:Person) WHERE v.Person.age == 35 RETURN v LIMIT 2;# 返回结果
("2" :Employee{workingAge: 4} :Person{age: 35, name: "李四", type: "领导"})
("12" :Person{age: 35, name: "小杨", type: "领导"})
匹配点 ID
用户可以使用点 ID 去匹配点。id()函数可以检索点的 ID。
#
MATCH (v) WHERE id(v) == '1' RETURN v;# 返回结果
("1" :Person{age: 30, name: "张三", type: "员工"})
匹配多个ID
注意:你必须先指定 Tag/EdgeType,或者用 LIMIT 子句限制返回数量,才能获取对应类型的所有的点和边。
#
MATCH (v:Person) WHERE id(v) IN {'1','2'} RETURN v;# 返回结果
("2" :Employee{workingAge: 4} :Person{age: 35, name: "李四", type: "领导"})
("1" :Person{age: 30, name: "张三", type: "员工"})
返回属性
#
MATCH (v:Person) WHERE id(v) IN {'1','2'} RETURN v.Person.name AS name;# 返回结果
李四
张三
匹配连接的点
使用–符号表示两个方向的边
#
MATCH (v:Person{name:"小明"})--(v2:Person) RETURN v2.Person.name AS Name;# 返回结果
小芳
李四
小静
赵六
小红
在–符号上增加<或>符号指定边的方向
#
MATCH (v:Person{name:"小明"})-->(v2:Person) RETURN v2.Person.name AS Name;# 返回结果
李四
小红
小静
增加更多点和边
#
MATCH (v:Person{name:"小明"})-->(v2:Person)-->(v3) RETURN v3.player.name AS Name;# 如果不需要引用点,可以省略括号中表示点的变量。
MATCH (v:Person{name:"小明"})-->()-->(v3) RETURN v3.player.name AS Name;# 返回结果
小芳
小李
小李
王五
王五
小杨
匹配路径
查询点的边
#
MATCH p=(v:Person{name:"小明"})-->(v2) RETURN p;# 返回结果
<("5" :Employee{workingAge: 10} :Person{age: 40, name: "小明", type: "领导"})-[:SUBORDINATE@0 {}]->("2" :Employee{workingAge: 4} :Person{age: 35, name: "李四", type: "领导"})>
<("5" :Employee{workingAge: 10} :Person{age: 40, name: "小明", type: "领导"})-[:FRIEND@0 {year: 6}]->("6" :Person{age: 22, name: "小红", type: "员工"})>
<("5" :Employee{workingAge: 10} :Person{age: 40, name: "小明", type: "领导"})-[:SUBORDINATE@0 {}]->("17" :Employee{workingAge: 8} :Person{age: 45, name: "小静", type: "领导"})>
查询存在的边
#
MATCH ()<-[e]-() RETURN e LIMIT 3;# 返回结果
[:FRIEND "7"->"8" @0 {year: 2}]
[:SUBORDINATE "7"->"8" @0 {}]
[:SUBORDINATE "7"->"1" @0 {}]
根据类型查询存在的边
#
MATCH ()-[e:SUBORDINATE]->() RETURN e LIMIT 3;# 返回结果
[:SUBORDINATE "17"->"7" @0 {}]
[:SUBORDINATE "17"->"15" @0 {}]
[:SUBORDINATE "5"->"2" @0 {}]
根据边的属性查询边
#
MATCH (v)-[e:FRIEND{year:3}]->(v2) WHERE id(v) == "2" RETURN e;# 返回结果
[:FRIEND "2"->"3" @0 {year: 3}]
对点补充过滤
#
MATCH (v:Person{name:"李四"})-[e:FRIEND{year:3}]->(v2) RETURN e;# 返回结果
[:FRIEND "2"->"3" @0 {year: 3}]
匹配多个类型的边
#
MATCH (v:Person{name:"小明"})-[e:SUBORDINATE|FRIEND]->(v2) RETURN e;# 返回结果
[:FRIEND "5"->"6" @0 {year: 6}]
[:SUBORDINATE "5"->"17" @0 {}]
[:SUBORDINATE "5"->"2" @0 {}]
匹配多条边
用户可以扩展模式,匹配路径中的多条边。
#
MATCH (v:Person{name:"小明"})-[]->(v2)<-[e:FRIEND]-(v3) RETURN v2, v3;
匹配定长路径
使用<edge_type>*匹配定长路径。hop必须是一个非负整数。
#
MATCH (v:Person{name:"小明"})-[e:FRIEND*3]->(v2) RETURN DISTINCT v2;# 返回结果
("8" :Person{age: 33, name: "小花", type: "员工"})
匹配变长路径
用户可以在模式中使用<edge_type>*[minHop…maxHop]匹配变长路径。
minHop 可选项。表示路径的最小长度。minHop必须是一个非负整数,默认值为 1。
maxHop 可选项。表示路径的最大长度。maxHop必须是一个非负整数,默认值为无穷大。
# 在数据库中匹配具有 "Person" 标签且属性 "name" 为 "小明" 的节点,以及从它们出发的类型为 "FRIEND" 的边,跳过 3 到 5 次后到达的节点,然后返回这些节点。
MATCH (v:Person{name:"小明"})-[e:FRIEND*3..5]->(v2) RETURN v2;
返回结果
("9" :Person{age: 28, name: "大海", type: "员工"})
("10" :Person{age: 22, name: "小雨", type: "员工"})
("8" :Person{age: 33, name: "小花", type: "员工"})
("10" :Person{age: 22, name: "小雨", type: "员工"})
("9" :Person{age: 28, name: "大海", type: "员工"})
("10" :Person{age: 22, name: "小雨", type: "员工"})
用户可以使用DISTINCT关键字聚合重复结果。
# 从名为 "小明" 的 "Person" 类型节点出发,通过不定长度的 "FRIEND" 边(跳数在 3 到 5 范围内),到达的节点为 "v2",返回不重复的 "v2" 节点及其出现的次数。
MATCH (v:Person{name:"小明"})-[e:FRIEND*3..5]->(v2) RETURN DISTINCT v2, COUNT(v2) AS count;
返回结果
V2 | count |
---|---|
(“8” :Person{age: 33, name: “小花”, type: “员工”}) | 1 |
(“9” :Person{age: 28, name: “大海”, type: “员工”}) | 2 |
(“10” :Person{age: 22, name: “小雨”, type: “员工”}) | 3 |
多个Edge type设置路径
用户可以指定多个 Edge type 的 hop、minHop和maxHop,这些配置对所有 Edge type 都生效。
# 从名为 "小明" 的 "Person" 类型节点出发,通过不定长度的 "SUBORDINATE" 或 "FRIEND" 边(跳数在 1 到 2 范围内),到达的节点为 "v2",返回不重复的 "v2" 节点及其出现的次数。
MATCH (v:Person{name:"小明"})-[e:SUBORDINATE|FRIEND*1..2]->(v2) RETURN DISTINCT v2, COUNT(v2) AS count;
返回结果
V2 | count |
---|---|
(“3” :Person{age: 28, name: “王五”, type: “员工”}) | 1 |
(“12” :Person{age: 35, name: “小杨”, type: “领导”}) | 1 |
(“6” :Person{age: 22, name: “小红”, type: “员工”}) | 1 |
(“17” :Employee{workingAge: 8} :Person{age: 45, name: “小静”, type: “领导”}) | 1 |
(“7” :Employee{workingAge: 2} :Person{age: 45, name: “小李”, type: “领导”}) | 2 |
(“15” :Person{age: 40, name: “小芳”, type: “领导”}) | 1 |
(“2” :Employee{workingAge: 4} :Person{age: 35, name: “李四”, type: “领导”}) | 1 |
匹配多个模式
用户可以用英文逗号(,)分隔多个模式。
# 匹配具有标签 "Person" 且属性 "type" 为 "领导" 的节点 "v1",以及具有标签 "Employee" 且属性 "workingAge" 为 2 的节点 "v2",然后返回这些节点。
MATCH (v1:Person{type:"领导"}), (v2:Employee{workingAge:2}) RETURN v1,v2;
返回结果
v1 | v2 |
---|---|
(“17” :Employee{workingAge: 8} :Person{age: 45, name: “小静”, type: “领导”}) | (“7” :Employee{workingAge: 2} :Person{age: 45, name: “小李”, type: “领导”}) |
(“12” :Person{age: 35, name: “小杨”, type: “领导”}) | (“7” :Employee{workingAge: 2} :Person{age: 45, name: “小李”, type: “领导”}) |
(“7” :Employee{workingAge: 2} :Person{age: 45, name: “小李”, type: “领导”}) | (“7” :Employee{workingAge: 2} :Person{age: 45, name: “小李”, type: “领导”}) |
(“15” :Person{age: 40, name: “小芳”, type: “领导”}) | (“7” :Employee{workingAge: 2} :Person{age: 45, name: “小李”, type: “领导”}) |
(“2” :Employee{workingAge: 4} :Person{age: 35, name: “李四”, type: “领导”}) | (“7” :Employee{workingAge: 2} :Person{age: 45, name: “小李”, type: “领导”}) |
(“5” :Employee{workingAge: 10} :Person{age: 40, name: “小明”, type: “领导”}) | (“7” :Employee{workingAge: 2} :Person{age: 45, name: “小李”, type: “领导”}) |
LOOKUP
- 检索指定 Tag 的所有点 ID。
- 检索指定 Edge type 的所有边的起始点、目的点和 rank。
- 统计包含指定 Tag 的点或属于指定 Edge type 的边的数量。
- 根据 WHERE 搜索特定数据。
# 语法
LOOKUP ON {<vertex_tag> | <edge_type>}
[WHERE <expression> [AND <expression> ...]]
YIELD <return_list> [AS <alias>]
[<clause>];
# 返回结果
<return_list><prop_name> [AS <col_alias>] [, <prop_name> [AS <prop_alias>] ...];
参数说明
参数 | 说明 |
---|---|
WHERE | 指定遍历的过滤条件,还可以结合布尔运算符 AND 和 OR 一起使用。详情请参见 WHERE。 |
YIELD | 定义需要返回的输出。详情请参见 YIELD。 |
AS | 设置别名。 |
clause | 支持 ORDER BY、LIMIT 子句。 |
查询点信息
于标签(TAG)的属性进行过滤
# 在 "Person" 类型节点中查找具有 "name" 属性为 "张三" 的节点,并返回这些节点的 ID。
LOOKUP ON Person WHERE Person.name == "张三" YIELD id(vertex);
返回数据
id(VERTEX) |
---|
1 |
基于标签(TAG)的多个进行过滤
# 在 "Person" 类型节点中查找具有 "type" 属性为 "领导" 且 "age" 属性为 35 或 28 的节点,并返回这些节点的 "name" 和 "age" 属性。
LOOKUP ON Person WHERE Person.type == "领导" AND Person.age IN [35,28] YIELD properties(vertex).name, properties(vertex).age;
返回数据
properties(VERTEX).name | properties(VERTEX).age |
---|---|
小杨 | 35 |
李四 | 35 |
检索边
基于边的条件进行过滤,并返回边信息
# 查找具有 "year" 属性为 3 的 "FRIEND" 类型边,并返回这些边。
LOOKUP ON FRIEND WHERE FRIEND.year == 3 YIELD edge AS e;
返回数据
e |
---|
[:FRIEND “2”->“3” @0 {year: 3}] |
[:FRIEND “3”->“4” @0 {year: 3}] |
基于边的条件进行过滤,并返回边信息的属性
# 查找具有 "year" 属性为 3 的 "FRIEND" 类型边,并返回这些边的 "year" 属性。
LOOKUP ON FRIEND WHERE FRIEND.year == 3 YIELD properties(edge).year;
返回数据
properties(EDGE).year |
---|
3 |
3 |
查询包含某种边的点信息
# 查找所有 "Person" 类型节点,并返回这些节点的 ID,然后限制结果返回前 4 条。
LOOKUP ON Person YIELD id(vertex) | LIMIT 4;
返回数据
id(VERTEX) |
---|
12 |
17 |
5 |
3 |
统计点和边的数量
# 查找所有 "Person" 类型节点,返回这些节点的 ID,并计算节点数目。
LOOKUP ON Person YIELD id(vertex)| YIELD COUNT(*) AS Person_Number;
返回数据
Person_Number |
---|
20 |
# 查找所有 "FRIEND" 类型边,返回这些边,并计算边的数目。
LOOKUP ON FRIEND YIELD edge AS e| YIELD COUNT(*) AS Follow_Number;
返回数据
Follow_Number |
---|
11 |
GO
# 语法
GO [[<M> TO] <N> STEPS] FROM <vertex_list>
OVER <edge_type_list> [{REVERSELY | BIDIRECT}]
[WHERE <conditions>]
YIELD [DISTINCT] <return_list>
[{SAMPLE <sample_list> | <limit_by_list_clause>}]
[| GROUP BY {<col_name> | <expression> | <position>} YIELD <col_name>]
[| ORDER BY <expression> [{ASC | DESC}]]
[| LIMIT [<offset>,] <number_rows>];
# 结果
<vertex_list> ::=<vid> [, <vid> ...]<edge_type_list> ::=<edge_type> [, <edge_type> ...]| *<return_list> ::=<col_name> [AS <col_alias>] [, <col_name> [AS <col_alias>] ...]
参数说明
参数 | 说明 |
---|---|
<N> STEPS | 指定跳数。如果没有指定跳数,默认值 N 为 1。 |
M TO N STEPS | 遍历 M ~N 跳的边。如果 M 为 0,输出结果和 M 为 1 相同。 |
<vertex_list> | 用逗号分隔的点 ID 列表,或特殊的引用符 $-.id 。 |
<edge_type_list> | 遍历的 Edge type 列表。 |
REVERSELY | BIDIRECT | 默认情况下检索的是 <vertex_list> 的出边(正向),REVERSELY 表示反向,即检索入边;BIDIRECT 为双向,即检索正向和反向,通过返回 <edge_type>._type 字段判断方向,其正数为正向,负数为反向。 |
WHERE <conditions> | 指定遍历的过滤条件。用户可以在起始点、目的点和边使用 WHERE 子句,还可以结合 AND 、OR 、NOT 、XOR 一起使用。 |
YIELD [DISTINCT] <return_list> | 定义需要返回的输出。当前支持 src(edge) 、dst(edge) 、type(edge) 等。 |
SAMPLE <sample_list> | 用于在结果集中取样。 |
<limit_by_list_clause> | 用于在遍历过程中逐步限制输出数量。 |
GROUP BY | 根据指定属性的值将输出分组。 |
ORDER BY | 指定输出结果的排序规则。 |
LIMIT [<offset>,] <number_rows> | 限制输出结果的行数。详情参见 LIMIT 。 |
匹配边
基于 ID 获取边信息
# 从节点 ID 为 "7" 出发,经过 "FRIEND" 类型边,返回目标节点。
GO FROM "7" OVER FRIEND YIELD dst(edge);
输出结果
dst(EDGE) |
---|
10 |
8 |
9 |
基于 ID 获取边信息和距离(2 步)获取边信息
# 从节点 ID 为 "7" 出发,经过 2 步的 "FRIEND" 类型边,返回目标节点。
GO 2 STEPS FROM "7" OVER FRIEND YIELD dst(edge);
输出结果
dst(EDGE) |
---|
10 |
9 |
结果去重
# 从节点 ID 为 "5" 和 "7" 出发,经过 "FRIEND" 类型边,返回不重复的起始节点的 "name" 属性。
GO FROM "5", "7" OVER FRIEND YIELD DISTINCT properties($^).name AS start_name;
输出结果
start_name |
---|
小明 |
小李 |
点匹配
获取开始和处理节点属性
# 从节点 ID 为 "5" 和 "7" 出发,经过 "FRIEND" 类型边,返回不重复的起始节点的 "name" 属性和不重复的目标节点的 "name" 属性。
GO FROM "5", "7" OVER FRIEND YIELD DISTINCT properties($^).name AS start_name, properties($$).name AS end_name;
输出结果
start_name | end_name |
---|---|
小明 | 小红 |
小李 | 小雨 |
小李 | 小花 |
小李 | 大海 |
结果分组
# 从节点 ID 为 "5" 和 "7" 出发,经过 "FRIEND" 类型边,获取边的源节点、目标节点和目标节点的 "age" 属性,然后按照源节点进行分组,返回源节点、目标节点集合和目标节点的 "age" 属性集合。
GO FROM "5", "7" OVER FRIEND YIELD src(edge) AS src, dst(edge) AS dst, properties($$).age AS age | GROUP BY $-.src YIELD $-.src AS src, collect_set($-.dst) AS dst, collect($-.age) AS age;
输出结果
src | dst | age |
---|---|---|
7 | {“9”, “10”, “8”} | [22, 33, 28] |
5 | {“6”} | [22] |
IS NOT EMPTY
# 从节点 ID 为 "5" 出发,经过 "SUBORDINATE" 类型边,如果目标节点的 "name" 属性不为空,返回目标节点的边。
GO FROM "5" OVER SUBORDINATE WHERE properties($$).name IS NOT EMPTY YIELD dst(edge);
输出结果
dst(edge) |
---|
17 |
2 |
FETCH
FETCH 可以获取指定点或边的属性值。
获取点的属性值
基于 ID 获取点的 TAG 信息。
# 获取节点 ID 为 "5" 的 "Person" 类型节点的属性信息。
FETCH PROP ON Person "5" YIELD properties(vertex);
返回结果
| properties(VERTEX) |
|----------------------------------------------------|
| {age: 40, name: "小明", type: "领导"} |
基于 ID 获取点的 TAG 信息的属性。
# 获取节点 ID 为 "5" 的 "Person" 类型节点的属性信息,并将其 "name" 属性命名为 "name"。
FETCH PROP ON Person "5" YIELD properties(vertex).name AS name;
返回结果
| name |
|------|
| 小明 |
基于多个 ID 获取点的 TAG 信息,使用英文逗号分隔。
# 获取节点 ID 分别为 "5", "6", "7" 的 "Person" 类型节点的属性信息。
FETCH PROP ON Person "5", "6", "7" YIELD properties(vertex);
返回结果
| properties(VERTEX) |
|----------------------------------------------------|
| {age: 22, name: "小红", type: "员工"} |
| {age: 40, name: "小明", type: "领导"} |
| {age: 45, name: "小李", type: "领导"} |
在 FETCH 语句中获取多个 Tag 值,使用英文逗号分隔。
# 获取具有 "Person" 或 "Employee" 标签的节点中,节点 ID 为 "5" 的节点的属性信息,并将其命名为 "v"。
FETCH PROP ON Person, Employee "5" YIELD vertex AS v;
返回结果
| v |
|--------------------------------------------------|
| ("5" :Person{age: 40, name: "小明", type: "领导"}) |
Tag过滤
查询多个 ID 的多个 Tag 值。
# 获取具有 "Person" 或 "Employee" 标签的节点中,节点 ID 分别为 "5", "6" 的节点的属性信息,并将其命名为 "v"。
FETCH PROP ON Person, Employee "5", "6" YIELD vertex AS v;
返回结果
| v |
|--------------------------------------------------|
| ("5" :Person{age: 40, name: "小明", type: "领导"}) |
| ("6" :Person{age: 22, name: "小红", type: "员工"}) |
在 FETCH 语句中使用 * 获取当前图空间所有标签里,点的属性值。
# 获取所有类型的节点中,节点 ID 分别为 "5", "6", "7" 的节点的属性信息,并将其命名为 "v"。
FETCH PROP ON * "5", "6", "7" YIELD vertex AS v;
返回结果
| v |
|--------------------------------------------------|
| ("6" :Person{age: 22, name: "小红", type: "员工"}) |
| ("5" :Person{age: 40, name: "小明", type: "领导"}) |
| ("7" :Person{age: 45, name: "小李", type: "领导"}) |
边匹配
语法
FETCH PROP ON <edge_type> <src_vid> -> <dst_vid>[@<rank>] [, <src_vid> -> <dst_vid> ...]
YIELD <output>;
参数说明
参数 | 说明 |
---|---|
edge_type | Edge type 名称。 |
src_vid | 起始点 ID,表示边的起点。 |
dst_vid | 目的点 ID,表示边的终点。 |
rank | 边的 rank。可选参数,默认值为0。起始点、目的点、Edge type 和 rank 可以唯一确定一条边。 |
YIELD | 定义需要返回的输出。详情请参见 YIELD。 |
获取边的属性值
# 获取从节点 ID 为 "7" 到节点 ID 为 "10" 的 "FRIEND" 类型边的属性信息。
FETCH PROP ON FRIEND "7" -> "10" YIELD properties(edge);
返回结果
| properties(EDGE) |
|-------------------|
| {year: 9} |
获取点之间边的属性
# 获取从节点 ID 为 "7" 到节点 ID 为 "10" 的 "FRIEND" 类型边的 "year" 属性。
FETCH PROP ON FRIEND "7" -> "10" YIELD properties(edge).year;
返回结果
| properties(EDGE).year |
|------------------------|
| 9 |
获取多条边的属性值,模式之间用英文逗号(,)分隔。
# 获取从节点 ID 为 "7" 到节点 ID 为 "8", "9", "10" 的 "FRIEND" 类型边的属性信息。
FETCH PROP ON FRIEND "7" -> "8","7" -> "9","7" -> "10" YIELD properties(edge);
返回结果
| properties(EDGE) |
|-------------------|
| properties(EDGE) |
| {year: 2} |
| {year: 8} |
| {year: 9} |
基于 rank 获取属性值,
如果有多条边,起始点、目的点和 Edge type 都相同,可以通过指定 rank 获取正确的边属性值。
# 获取从节点 ID 为 "7" 到节点 ID 为 "8" 的 "FRIEND" 类型边的属性信息,并将其命名为 "e"。
FETCH PROP ON FRIEND "7" -> "8"@0 YIELD edge AS e;
返回结果
| e |
|-------------------------------------------|
| [:FRIEND "7"->"8" @0 {year: 2}] |
查询从某个点开始的边的信息
# 从节点 ID 为 "7" 出发,通过 "FRIEND" 类型边的 "src" 和 "dst" 属性,获取对应的边
GO FROM "7" OVER FRIEND YIELD src(edge) AS s, dst(edge) AS d | FETCH PROP ON FRIEND $-.s -> $-.d YIELD properties(edge);
返回结果
properties(EDGE) |
---|
{year: 9} |
{year: 2} |
{year: 8} |
SHOW
显示相关源数据信息
命令 | 说明 | 示例 |
---|---|---|
SHOW CHARSET | 语句显示当前的字符集 | SHOW CHARSET |
SHOW COLLATION | 语句显示当前的排序规则 | SHOW COLLATION |
SHOW CREATE SPACE | 显示指定图空间的创建语句 | SHOW CREATE SPACE <space_name> |
SHOW CREATE TAG/EDGE | 显示指定 Tag 的基本信息 | SHOW CREATE {TAG <tag_name> |
SHOW HOSTS | 显示集群信息,包括端口、状态、leader、分片、版本等信息 | SHOW HOSTS [GRAPH |
SHOW INDEX STATUS | 显示重建原生索引的作业状态 | SHOW {TAG |
SHOW INDEXES | 列出当前图空间内的所有 Tag 和 Edge type | SHOW {TAG |
SHOW PARTS | 显示图空间中指定分片或所有分片的信息 | SHOW PARTS [<part_id>] |
SHOW ROLES | 显示分配给用户的角色信息 | SHOW ROLES IN <space_name> |
SHOW SNAPSHOTS | 语句显示所有快照信息 | SHOW SNAPSHOTS |
SHOW SPACES | 显示现存的图空间 | SHOW SPACES |
SHOW STATS | 显示最近一次SUBMIT JOB STATS作业收集的图空间统计信息 | SHOW STATS |
SHOW TAGS | 语句显示当前图空间内的所有 Tag | SHOW TAGS |
SHOW EDGES | SHOW EDGES语句显示当前图空间内的所有 Edge type | SHOW EDGES |
SHOW USERS | 显示用户信息 | SHOW USERS; |
SHOW SESSIONS | 用户可以查询会话信息 | SHOW [LOCAL] SESSIONS;SHOW SESSION <Session_Id> |
SHOW QUERIES | 查看当前 Session 中正在执行的查询请求信息 | SHOW [LOCAL] QUERIES |
SHOW META LEADER | 当前 Meta 集群的 leader 信息 | SHOW META LEADER |
相关文章:
Nebula基础的查询操作介绍
Nebula基础的查询操作介绍 这里只是对Nebula基础查询进行介绍,其目的是为了让未接触过Nebula的同学最短时间了解其语句。更详细更准确的内可以查看官方文档。 docs.nebula-graph 关于查询这里并没有使用官方例子数据,而是自己实际尝试了文档中的语句。 …...
C++ STL序列式容器(详解)
STL基础 C STL基本组成(6大组件13个头文件) 通常认为,STL 是由容器、算法、迭代器、函数对象、适配器、内存分配器这 6 部分构成,其中后面 4 部分是为前 2 部分服务的,它们各自的含义如表 1 所示。 表 1 STL 组成…...
C++获取map最小值算法,STL---std::min_element()!
std::min_element 定义于头文件 <algorithm> 以下是API文档说明! 寻找范围 [first, last) 中的最小元素。 1) 用 operator< 比较元素。 3) 用给定的二元比较函数 comp 比较元素。 2,4) 同 (1,3) ,但按照 policy 执行。这些重载仅若 std::is…...
如何在Java实现TCP方式发送和接收Socket消息(多线程模式)
目录 导言:正文:1. 创建Server端:2. 创建Client端:3. 多线程模式: 代码示例Server端代码示例:Client端代码示例:同步模式发送TCP消息异步模式 结论: 导言: 在Java编程中…...
SYBASE查询全量字段及对应的表名方法
SELECT COLUMN_name,table_name,user_type,COLUMN_type,width FROM syscolumn a,systable b WHERE a.table_idb.table_id AND COLUMN_name...
Alions 8.6 下 Redis 7.2.0 集群搭建和配置
Redis 7.2.0 搭建和集群配置 一.Redis 下载与单机部署1.Redis 下载2.虚拟机配置3.Redis 单机源码安装和测试4.Java 单机连接测试1.Pom 依赖2.配置文件3.启动类4.配置类5.单元测试6.测试结果 二.Redis 集群部署1.主从1.从节点配置2.Java 测试 2.哨兵1.哨兵节点配置2.复制一个哨兵…...
Android Retrofit 使用及原理详解~
简介 在 Android 开发中,网络请求是一个极为关键的部分。Retrofit 作为一个强大的网络请求库,能够简化开发流程,提供高效的网络请求能力。本文将深入介绍 Retrofit 的高级使用与原理,帮助读者更全面地理解和应用这一库。 什么是…...
三种主要的云交付服务和安全模型
对于许多企业来说,当今的数字化转型之旅包括一个关键决策:采用符合其需求的云交付服务。 云计算已成为现代 IT 基础设施的主要组成部分,具有从可扩展性到成本效率等诸多优势。然而,与所有技术一样,云也有其自身的网络…...
python爬虫实战(3)--爬取某乎热搜
1. 分析爬取地址 打开某乎首页,点击热榜 这个就是我们需要爬取的地址,取到地址某乎/api/v3/feed/topstory/hot-lists/total?limit50&desktoptrue 定义好请求头,从Accept往下的请求头全部复制,转换成json headers {Accep…...
IPv4,IPv6,TCP,路由
主要回顾一下TCP/IP的传输过程,在这个过程中,做了什么事情 ip : 网际协议,IP协议能让世界上任意两台计算机之间进行通信。 IP协议的三大功能: 寻址和路由传递服务:不可靠(尽最大努力交付传输数据包&…...
Java 计算文本相似度
接受一个字符串和一个字符串列表作为参数的 Java 方法,用于计算两个字符串之间的相似度。 方法 import java.util.HashSet; import java.util.List; import java.util.Set;public class StringSimilarity {/*** 计算两个字符串之间的相似度* param str1 第一个字符…...
MySQL 视图
目录 一、视图概述 二、视图的作用和优点 三、视图的使用规则 四、视图操作 1、创建视图 2、查看视图 1)查看视图基本信息 2)查看视图详细信息 3、修改视图 4、更新视图 5、删除视图 一、视图概述 视图是数据库中的一个虚拟表,同真…...
深入理解回调函数qsort:从入门到模拟实现
🍁博客主页:江池俊的博客 💫收录专栏:C语言进阶之路 💡代码仓库:江池俊的代码仓库 🎪我的社区:GeekHub 🎉欢迎大家点赞👍评论📝收藏⭐ 文章目录 前…...
【Git基础】获取远程仓库
我们通常从远程服务器克隆一个Git仓库或者将本地仓库初始化为Git仓库。 1 从远程服务器克隆一个Git仓库 $ git clone https://github.com/your-username/your-repo-name你可以自定义其仓库名称: $ git clone https://github.com/your-username/your-repo-name cu…...
chatGPT界面
效果图: 代码: <!DOCTYPE html> <html> <head><title>复选框样式示例</title> </head> <style>* {padding:0;margin: 0;}.chatpdf{display: flex;height: 100vh;flex-direction: row;}.chatpdf .pannel{widt…...
windows一键启动jupyter
windows一键启动jupyter jupyter简介 Jupyter是一个开源的交互式计算环境,主要用于数据分析、数据可视化和科学计算。它的名字来源于三种编程语言的缩写:Julia、Python和R,这三种语言都可以在Jupyter环境中运行。如果您想进行数据分析、科学…...
树形结构的快速生成
背景 相信大家都遇到过树形结构,像是文件列表、多级菜单、评论区的设计等等,我们都发现它有很多层级,第一级可以有多个,下边的每一个层级也可以有多个;有的可以设计成无限层级的,有的只能设计成两级。那么…...
Android笔记(二十七):自定义Dialog实现居中Toast
背景 记录实现符合项目需求的Toast弹窗 具体实现 class MyTipDialog private constructor(val context: Activity): Dialog(context, R.style.MyTipTheme) {val resId ObservableField(0)private val mainHandler Handler(Looper.getMainLooper())init {setCanceledOnTouc…...
css实现文字的渐变,适合大屏
1 在全局写一个全局样式,文字渐变 2 在组件中使用 CSS3利用-webkit-background-clip: text;实现文字渐变效果_css如何把盒子底部的文字变成透明渐变_I俩月亮的博客-CSDN博客 CSS 如何实现文字渐变色 ?_css字体颜色渐变_一个水瓶座程序猿.的博客-CSDN博客…...
软考高级系统架构设计师系列论文八十七:论企业应用集成
软考高级系统架构设计师系列论文八十七:论企业应用集成 一、企业应用集成相关知识点二、摘要三、正文四、总结一、企业应用集成相关知识点 软考高级系统架构设计师系列之:企业集成平台技术的应用和架构设计二、摘要 本文讨论了某公司的应用系统集成项目。某公司为了应对市场变…...
C++设计模式之适配器模式
一、适配器模式 适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成另一个类所期望的接口,以便两个类能够协同工作。 适配器模式可以解决现有类接口与所需接口不匹配的问题,使得原本因接口不…...
山西电力市场日前价格预测【2023-08-24】
日前价格预测 预测明日(2023-08-24)山西电力市场全天平均日前电价为319.98元/MWh。其中,最高日前电价为370.78元/MWh,预计出现在19: 30。最低日前电价为272.42元/MWh,预计出现在12: 45。 价差方向预测 1: 实…...
一文速学-让神经网络不再神秘,一天速学神经网络基础(一)
前言 思索了很久到底要不要出深度学习内容,毕竟在数学建模专栏里边的机器学习内容还有一大半算法没有更新,很多坑都没有填满,而且现在深度学习的文章和学习课程都十分的多,我考虑了很久决定还是得出神经网络系列文章,…...
百度Q2财报:营收341亿元实现加速增长,净利润高速增长44%,增长强劲全线重构
北京时间8月22日,百度发布了截至2023年6月30日的第二季度未经审计的财务报告。第二季度,百度实现营收341亿元,同比增长15%;归属百度的净利润(non-GAAP)达到80亿元,同比增长44%。营收和利润双双实…...
ARM DIY(二)配置晶振频率
文章目录 前言串口乱码问题定位内核修改晶振频率uboot 修改晶振频率番外篇 前言 上篇文章《ARM DIY 硬件调试》介绍了 DIY ARM 板的基础硬件焊接,包括电源、SOC、SD 卡座等,板子已经可以跑起来了。 但是发现串口乱码,今天就来解决串口乱码问…...
高等数学:线性代数-第三章
文章目录 第3章 矩阵的初等变换与线性方程组3.1 矩阵的初等变换3.2 矩阵的秩3.3 方程组的解 第3章 矩阵的初等变换与线性方程组 3.1 矩阵的初等变换 矩阵的初等变换 下面三种变换称为矩阵的初等变换 对换两行(列),记作 r i ↔ r j ( c i …...
深入理解 SQL 注入攻击原理与防御措施
系列文章目录 文章目录 系列文章目录前言一、SQL 注入的原理二、防御 SQL 注入攻击的措施1. 使用参数化查询2.输入验证与过滤3.最小权限原则4.不要动态拼接 SQL5.ORM 框架6.转义特殊字符三、实例演示总结前言 SQL 注入是一种常见的网络攻击方式,攻击者通过在输入框等用户交互…...
QT5.12.12通过ODBC连接到GBase 8s数据库(CentOS)
本示例使用的环境如下: 硬件平台:x86_64(amd64)操作系统:CentOS 7.8 2003数据库版本(含CSDK):GBase 8s V8.8 3.0.0_1 为什么使用QT 5.12.10?该版本包含QODBC。 1&#…...
爱校对发布全新PDF校对工具,为用户带来更为便捷的校正体验
随着数字化文档使用的普及,PDF格式已经成为最为广泛使用的文件格式之一。为满足广大用户对于高效、准确PDF文档校对的需求,爱校对团队经过深入研发,正式推出全新的PDF校对工具! 这一全新工具针对PDF文件格式进行了深度优化&#…...
记录protocol buffers Mac安装
使用brew安装最新的protobuf 在Mac 上安装,使用brew 可以安装最新的protobuf。这个也比较简单,简单说一下。 首先先检查一下是否安装了brew。如果没有安装brew的话,请先安装brew.可以通过brew --version来检查 使用brew install protobuf 来…...
做网站销售的话术/seo首页网站
#!/bin/bash cat /root/.ssh/id_rsa.pub >> /root.ssh/authorized_keys 将公钥导到auth文件中去 host1cat /root/a ##a文件里的内容是你想要scp公钥的目标主机地址 for i in $host1; do command1"scp /root/.ssh/authorized_keys $i:/root/.ssh/authorized…...
星月教你做网站回顾文档/百度推广售后客服电话
***服务大家都知道,虚拟专用网络,今天我们就来说说怎么用linux搭建pptp *** 说实话,我这也算是第一次照着命令敲然后成功了的,最后才搞明白怎么回事,特贡献出来给大家,希望大家共同进步 系统环境: 2.6.18-9…...
网站多少图片怎么做超链接/个人接广告的平台
本文作者是法国里尔大学Inria SequeL团队的博士生,Yannis Flet-Berliac,他在本文中对分层强化学习(HRL)的研究进行了总结,文章首先回顾了强化学习(RL)的基本原理,并阐述了其目前所面…...
做愛视频网站/设计网站排行榜前十名
参考 文章目录前言小程序应用生命周期App(Object object)小程序页面生命周期Page(Object object)页面页面配置onLoadonHideonPullDownRefresh:onReachBottomonShareAppMessageonPageScrollonResize在手机启用屏幕旋转页面跳转Navigator方法一 可返回方法二 原地销毁…...
班级网站建设的参考文献/推广app赚佣金平台
在 老熊 的Blog上看到他们写的有关ORA-04031的文章,转到blog。 老熊的Blog: http://www.laoxiong.net/an-ora-04031-case.html ORA-04031这个错误,几乎每一个专业的DBA都遇到过。这是一个相当严重的错误,Oracle进程在向SGA申请内存…...
深圳网站建设制作优化/seo免费入门教程
一些红旗Linux用户想要通过无线上网卡上网,但是又担心网络安全问题。那么该怎么解决这部分用户的烦恼呢?现在小编就教大家提高电脑上网安全的设置方法。设置方法:1. 运行:开始-网络-拨号程序(如果在root下就…...