https://docs.nebula-graph.com.cn/3.0.1/3.ngql-guide/7.general-query-statements/2.match/
CREATE TAG player (name string, age int);
INSERT VERTEX actor(name, age) VALUES "1":("Tim Duncan", 39);
INSERT VERTEX actor(name, age) VALUES "2":("hehe", 32);
INSERT VERTEX actor(name, age) VALUES "3":("haohao", 32);
UPDATE VERTEX ON player "2" SET name = "two"
UPDATE VERTEX ON player "3" SET name = "three"
CREATE TAG INDEX IF NOT EXISTS name ON player(name(20));
CREATE EDGE INDEX IF NOT EXISTS follow_index on follow();
CREATE TAG actor (name string, age int);
INSERT VERTEX actor(name, age) VALUES "player100":("Tim Duncan", 42);
CREATE EDGE IF NOT EXISTS e1();
CREATE EDGE IF NOT EXISTS e2 (name string, age int);
INSERT EDGE e2 (name, age) VALUES "1"->"2":("n1", 12);
INSERT EDGE e2 (name, age) VALUES "3"->"2":("n3", 32);
INSERT EDGE e1 () VALUES "1"->"3":();
INSERT EDGE e1 () VALUES "2"->"3":();
INSERT EDGE e1 () VALUES "3"->"2":();
# 重建索引使其生效。
REBUILD TAG INDEX name;
REBUILD EDGE INDEX follow_index
匹配 Tag
MATCH (v:player) RETURN v LIMIT 3;
匹配点:
MATCH (v) RETURN v LIMIT 5;
匹配多tag到点:
MATCH (v:player:actor) RETURN v LIMIT 10;
匹配点的属性
match (v:player{name:"hehe"}) return v
MATCH (v:player) WHERE v.player.name == "Tim Duncan" RETURN v;
MATCH (v) WHERE id(v) == 'player100' RETURN v;
点点查找;
match(v:player{name:"hehe"})--(v2) where id(v2) in ["1","2"] return v2;
match (v) return v limit 10
MATCH (v:player{name:"Tim Duncan"})--(v2:player) RETURN v2
用户可以在--符号上增加<或>符号指定边的方向
MATCH (v:player{name:"Tim Duncan"})-->(v2:player) RETURN v2.player.name AS Name;
case表达式:
MATCH (v:player{name:"Tim Duncan"})--(v2) \
RETURN \
CASE WHEN v2.team.name IS NOT NULL \
THEN v2.team.name \
WHEN v2.player.name IS NOT NULL \
THEN v2.player.name END AS Name;
MATCH (v:player{name:"Tim Duncan"})-->(v2)<--(v3) \
RETURN v3.player.name AS Name;
匹配路径
MATCH p=(v:player{name:"Tim Duncan"})-->(v2) RETURN p
匹配边:
MATCH ()<-[e]-() RETURN e LIMIT 3;
匹配边type:
MATCH ()-[e:e1]->() RETURN e imit 3;
MATCH ()-[e:e2]->() RETURN e imit 3;
匹配边属性:
MATCH (v:player{name:"Tim Duncan"})-[e:e2{age:12}]->(v2) RETURN e;
多边type:
MATCH (v:player{name:"Tim Duncan"})-[e:e1|:e2]->(v2) RETURN e;
匹配多边
MATCH (v:player{name:"Tim Duncan"})-[]->(v2)<-[e:e1]-(v3) RETURN v2, v3;
匹配定长路径
MATCH p=(v:player{name:"Tim Duncan"})-[e:e1*2]->(v2) RETURN DISTINCT v2 AS Friends;
如果hop为 0,模式会匹配路径上的起始点
MATCH (v:player{name:"Tim Duncan"}) -[*0]-> (v2) RETURN v2;
匹配变长路径:
MATCH p=(v:player{name:"Tim Duncan"})-[e:e1*1..3]->(v2) RETURN v2 AS Friends;
匹配多个 Edge type 的变长路径:
MATCH p=(v:player{name:"Tim Duncan"})-[e:e1|e2*2]->(v2) RETURN DISTINCT v2;
匹配多模式:
MATCH (v1:player{name:"Tim Duncan"}), (v2:actor{name:"Tim Duncan"}) RETURN v1,v2;
多MATCH检索
MATCH (m)-[]->(n) WHERE id(m)=="2" \
MATCH (n)-[]->(l) WHERE id(n)=="1" \
RETURN id(m),id(n),id(l);
############
option match
MATCH (m)-[]->(n) WHERE id(m)=="1" RETURN id(m),id(n)
MATCH (m)-[]->(n) WHERE id(m)=="1" OPTIONAL MATCH (n)-[]->(l) WHERE id(n)=="2" RETURN id(m),id(n),id(l);
######### lookup
CREATE TAG INDEX IF NOT EXISTS index_player ON player(name(30), age);
REBUILD TAG INDEX index_player;
LOOKUP ON player \
WHERE player.name == "Tim Duncan" \
YIELD id(vertex);
LOOKUP ON player WHERE player.age > 30 IELD id(vertex);
#### 搞挂了 #####
match (v) return v limit 10
LOOKUP ON player \
WHERE player.name STARTS WITH "h" \
YIELD properties(vertex).name, properties(vertex).age;
###########
检索边
CREATE EDGE INDEX IF NOT EXISTS index_e2 ON e2(age);
REBUILD EDGE INDEX index_e2;
show jobs;
LOOKUP ON e2 WHERE e2.age == 12 YIELD edge AS e
LOOKUP ON e2 \
WHERE e2.age > 30 \
YIELD properties(edge).age;
LOOKUP ON e2 \
WHERE e2.age == 12 \
YIELD dst(edge) AS DstVID, properties(edge).age AS age
####### 不好使:
LOOKUP ON e2 \
WHERE e2.age == 12 \
YIELD dst(edge) AS DstVID, properties(edge).age AS age |\
GO FROM $-.DstVID OVER player \
YIELD $-.DstVID, properties(edge).age, properties($$).name;
############## go #########
GO FROM "1" OVER e2 YIELD dst(edge);
两跳的
GO 2 steps FROM "1" OVER e1 YIELD dst(edge);
过滤条件:
GO FROM "1", "2" OVER e2 \
WHERE properties(edge).age > 10 \
YIELD DISTINCT properties($$).name AS team_name, properties(edge).age AS age, properties($^).name AS player_name;
GO FROM "1" OVER e1, e2 YIELD properties(edge).age;
GO FROM "2" OVER e2 REVERSELY \
YIELD src(edge) AS destination;
该 MATCH 查询与上一个 GO 查询具有相同的语义。
MATCH (v)<-[e:e2]- (v2) WHERE id(v) == '2' \
RETURN id(v2) AS destination;
GO FROM "2" OVER e2 REVERSELY \
YIELD src(edge) AS id | \
GO FROM $-.id OVER e2 \
WHERE properties($^).age > 10 \
YIELD properties($^).name AS FriendOf, properties($$).name AS Team;
该 MATCH 查询与上一个 GO 查询具有相同的语义
MATCH (v)-[e:e2]->(v2)<-[e2:e2]-(v3) WHERE id(v) == '1' RETURN v2.player.name AS FriendOf, v3.player.name AS Team;
查询 player100 1~2 跳内的朋友
GO 1 TO 2 STEPS FROM "1" OVER follow \
YIELD dst(edge) AS destination;
GO 1 TO 2 STEPS FROM "1" OVER e2 YIELD dst(edge) AS destination;
GO 1 TO 2 STEPS FROM "1" OVER e1 YIELD dst(edge) AS destination;
该 MATCH 查询与上一个 GO 查询具有相同的语义。
MATCH (v) -[e:e2*1..2]->(v2) WHERE id(v) == "1" RETURN id(v2) AS destination;
根据年龄分组。
GO 1 STEPS FROM "1" OVER e2 \
YIELD src(edge) AS src, dst(edge) AS dst, properties($$).age AS age \
| GROUP BY $-.dst \
YIELD $-.dst AS dst, collect_set($-.src) AS src, collect($-.age) AS age
分组并限制输出结果的行数。
GO FROM "1" OVER e2 YIELD src(edge) AS src, dst(edge) AS dst;
$a = GO FROM "1" OVER e2 YIELD src(edge) AS src, dst(edge) AS dst; \
GO FROM $a.dst OVER e1 \
YIELD $a.src AS src, $a.dst, src(edge), dst(edge) \
| ORDER BY $-.src
$a = GO FROM "1" OVER e2 YIELD src(edge) AS src, dst(edge) AS dst; \
GO FROM $a.dst OVER e1 \
YIELD $a.src AS src, $a.dst, src(edge), dst(edge) \
| ORDER BY $-.src | OFFSET 1 LIMIT 2;
############## fetch 语句:
FETCH PROP ON player "1" YIELD properties(vertex);
FETCH PROP ON player "1" YIELD properties(vertex).name AS name;
多tag上的值:
fetch prop on player,actor "1" yield vertex as v;
fetch prop on player,actor "1","2" yield vertex as v;
FETCH语句中使用*获取当前图空间所有标签里,点的属性值
FETCH PROP ON * "1", "2", "3" YIELD vertex AS v
获取边上的值
FETCH PROP ON e2 "1" -> "2" YIELD properties(edge);
FETCH PROP ON e2 "3" -> "2" YIELD properties(edge);
获取边上的指定属性值:
FETCH PROP ON e2 "1" -> "2" \
YIELD properties(edge).age;
获取多条边的属性值:
FETCH PROP ON e2 "1" -> "2", "3" -> "2" YIELD edge AS e;
符合语句:
GO FROM "1" OVER e2 \
YIELD src(edge) AS s, dst(edge) AS d \
| FETCH PROP ON e2 $-.s -> $-.d \
YIELD properties(edge).age;
用户也可以通过自定义变量构建类似的查询。
$var = GO FROM "1" OVER e2 \
YIELD src(edge) AS s, dst(edge) AS d; \
FETCH PROP ON e2 $var.s -> $var.d \
YIELD properties(edge).age;
分享到:
相关推荐
3-3 Nebula Graph v3 ——开源分布式高性能图数据库
Nebula Graph 源码解读系列-Vol.01 Nebula Graph技术概述.docx
图数据库nebula的前端展示界面
基于Nebula Graph和Springboot的数据库ORM框架NGBATIS设计源码,该项目包含215个文件,主要文件类型有135个java源文件,以及35个Markdown文档用于项目说明。此外,还包括17个xml配置文件,以及6个yaml配置文件。该...
Jepsen 测试框架在图数据库 Nebula Graph 中的技术实践.docx
Nebula Graph 源码解读系列-Vol.03 Planner的实技术现.docx
星云图(Nebula Graph)是一个开放源代码图数据库,能够托管具有数十亿个顶点(节点)和数万亿条边(具有几毫秒的延迟)的超大规模图。 它提供了企业级的高性能,可以将可以想象得到的最复杂的数据集简化为有意义和...
nebula-graph new
nebula-graph-3.2.0.el7.x86_64 安装包,包含客户端console
图数据库nebula官方可视化studio的2.0版本docker-compose安装文件
本文介绍如何使用 Docker Swarm 来部署 Nebula Graph 集群。 二、nebula集群搭建 2.1 环境准备 机器准备 ip 内存(Gb) cpu(核数) 192.168.1.166 16 4 192.168.1.167 16 4 192.168.1...
图数据库nebula官方2.0.0版本的rpm安装包
nebula-graph-studio-3.8.0版本 Centos7.9 ARM架构服务器编译的程序,直接解压,运行start.sh脚本即可。
nebula-graph-study nebula-graph-study 数据结构 Vertex 点 保存实体对象的实例 VID 为唯一表示 点必须至少有一个 Tag Tag 标签 用于对点进行区分。相同标签共享相同属性类型 Edge 边 描述 点与点之间的关系行为 一...
nebula图数据库V2.6.0
SpringGraph实例 用SpringGraph做的一下小实例
9-4.Nebula+Graph+v2.x开源分布式高性能图数据库
星云nodejs 该存储库在Node.js中提供了Nebula客户端API。 下载nebula-nodejs npm install nebula-nodejs 用法示例 建造一个NebulaPool 参加会议 例会 测验 npm install npm test