Nebula Graph学习篇1_基础概念、初步使用、整合SpringBoot使用

2023-05-16

目录

一、基础概念

  1. 图数据库的概念
  2. 适用场景
  3. 数据模型
  4. 路径
  5. 点的VID
  6. 架构

二、初步使用

  1. Windows安装Nebula-Graph服务
  2. Nebula Console 连接 Nebula-Graph
  3. 常用命令
    • 3.1异步实现创建修改类型
    • (1)nGQL创建选择图空间
    • (2)nGQL创建Tag和EdgeType
    • (3)nGQL插入边和点
    • (4)查询数据
      • 1、GO查询语句
      • 2、FETCH查询语句
      • 3、LOOKUP查询语句
      • 4、MATCH查询语句

三、整合SpringBoot使用

一、基础概念

1、图数据库概念

Nebula Graph 是一款开源的、分布式的、易扩展的原生图数据库,能够承载包含数千亿个点和数万亿条边的超大规模数据集,并且提供毫秒级查询。

  • 官网:https://nebula-graph.com.cn/
  • segmentfault:https://segmentfault.com/t/nebula
  • 中文文档:https://docs.nebula-graph.com.cn/3.1.0/1.introduction/2.1.path/
  • github:https://github.com/vesoft-inc/nebula
  • b站视频:https://space.bilibili.com/472621355

图数据库:图数据库是专门存储庞大的图形网络并从中检索信息的数据库。它可以将图中的数据高效存储为点(Vertex)边(Edge),还可以将属性(Property)附加到点和边上。

在这里插入图片描述

2、适用场景

Nebula Graph 可用于各种基于图的业务场景。为节约转换各类数据到关系型数据库的时间,以及避免复杂查询,建议使用 Nebula Graph。

  • 欺诈检测¶金融机构必须仔细研究大量的交易信息,才能检测出潜在的金融欺诈行为,并了解某个欺诈行为和设备的内在关联。这种场景可以通过图来建模,然后借助 Nebula Graph,可以很容易地检测出诈骗团伙或其他复杂诈骗行为。

  • 实时推荐¶Nebula Graph 能够及时处理访问者产生的实时信息,并且精准推送文章、视频、产品和服务。

  • 知识图谱¶自然语言可以转化为知识图谱,存储在 Nebula Graph 中。用自然语言组织的问题可以通过智能问答系统中的语义解析器进行解析并重新组织,然后从知识图谱中检索出问题的可能答案,提供给提问人。

  • 社交网络¶人际关系信息是典型的图数据,Nebula Graph 可以轻松处理数十亿人和数万亿人际关系的社交网络信息,并在海量并发的情况下,提供快速的好友推荐和工作岗位查询。

3、数据模型

Nebula Graph 数据模型使用 6 种基本的数据模型:

  1. 图空间(Space):图空间用于隔离不同团队或者项目的数据。不同图空间的数据是相互隔离的,可以指定不同的存储副本数、权限、分片等。

  2. 点(Vertex):点用来保存实体对象,特点如下:点是用点标识符(VID)标识的。VID在同一图空间中唯一。VID 是一个 int64,或者 fixed_string(N)。点可以有 0 到多个 Tag(一个Tag包含一组预先指定的KV键值对)。(Nebula Graph 2.x 及以下版本中的点必须包含至少一个 Tag。)

  3. 边(Edge):边是用来连接点的,表示两个点之间的关系或行为,特点如下:

    • 两点之间可以有多条边。边是有方向的,不存在无向边。
    • 四元组 <起点 VID、Edge type、边排序值 (rank)、终点 VID> 用于唯一标识一条边。边没有 EID。
    • 一条边有且仅有一个 Edge type。
    • 一条边有且仅有一个 Rank(权值),类型为 int64,默认值为 0。关于Rank 可以用来区分 Edge type、起始点、目的点都相同的边。该值完全由用户自己指定。读取时必须自行取得全部的 Rank 值后排序过滤和拼接。不支持诸如next(), pre(), head(), tail(), max(), min(), lessThan(), moreThan()等函数功能,也不能通过创建索引加速访问或者条件过滤。
  4. 标签(Tag):Tag 由一组事先预定义的属性构成。

  5. 边类型(Edge type):Edge type 由一组事先预定义的属性构成。

  6. 属性(Property):属性是指以键值对(Key-value pair)形式表示的信息。
    在这里插入图片描述

对比关系型数据库中的概念解释Tag、EdgeType等概念:https://www.bilibili.com/video/BV1Q5411K7Gg?zw

4、路径

图论中一个非常重要的概念是路径,路径是指一个有限或无限的边序列,这些边连接着一系列点。

路径的类型分为三种:walktrailpath

在这里插入图片描述

  1. walk:walk类型的路径由有限或无限的边序列构成。遍历时点和边可以重复。查看示例图,由于 C、D、E 构成了一个环,因此该图包含无限个路径,例如A->B->C->D->EA->B->C->D->E->CA->B->C->D->E->C->D

  2. trail:trail类型的路径由有限的边序列构成。遍历时只有点可以重复边不可以重复。柯尼斯堡七桥问题的路径类型就是trail。查看示例图,由于边不可以重复,所以该图包含有限个路径,最长路径由 5 条边组成:A->B->C->D->E->C。又可分为两种类型cycle 和 circuit。
    在这里插入图片描述

    • cycle :是封闭的 trail 类型的路径,遍历时边不可以重复起点和终点重复并且没有其他点重复。在此示例图中,最长路径由三条边组成:A->B->C->AC->D->E->C.(当出现任意一个闭环)
    • circuit :是封闭的 trail 类型的路径,遍历时边不可以重复除起点和终点重复外,可能存在其他点重复。在此示例图中,最长路径为:A->B->C->D->E->C->A
  3. path:path类型的路径由有限的边序列构成。遍历时点和边都不可以重复。由于点和边都不可以重复,所以该图包含有限个路径,最长路径由 4 条边组成:A->B->C->D->E

总结
在这里插入图片描述

5、点的VID

在 Nebula Graph 中,一个点由点的 ID 唯一标识,即 VID 或 Vertex ID。参考:https://docs.nebula-graph.com.cn/3.1.0/1.introduction/3.vid/

1、VID 的特点

  • VID 数据类型只可以为定长字符串FIXED_STRING(<N>)INT64;一个图空间只能选用其中一种 VID 类型。
  • VID 在一个图空间中必须唯一,其作用类似于关系型数据库中的主键(索引+唯一约束)。但不同图空间中的 VID 是完全独立无关的。
  • 点 VID 的生成方式必须由用户自行指定,系统不提供自增 ID 或者 UUID。
  • VID 相同的点,会被认为是同一个点。举栗:VID 相当于一个实体的唯一标号,例如一个人的身份证号。Tag 相当于实体所拥有的类型,例如"滴滴司机"和"老板"。不同的 Tag 又相应定义了两组不同的属性,例如"驾照号、驾龄、接单量、接单小号"和"工号、薪水、债务额度、商务电话"。
  • 同时操作相同 VID 并且相同 Tag 的两条INSERT语句(均无IF NOT EXISTS参数),晚写入的INSERT会覆盖先写入的。
  • 同时操作包含相同 VID 但是两个不同TAG A和TAG B的两条INSERT语句,对TAG A的操作不会影响TAG B。
  • VID 通常会被(LSM-tree 方式)索引并缓存在内存中,因此直接访问 VID 的性能最高。

2、VID 使用建议

  • Nebula Graph 1.x 只支持 VID 类型为INT64,从 2.x 开始支持INT64和FIXED_STRING()。在CREATE SPACE中通过参数vid_type可以指定 VID 类型。
  • 可以使用id()函数,指定或引用该点的 VID;
  • 可以使用LOOKUP或者MATCH语句,来通过属性索引查找对应的 VID;

性能上,

  • 直接通过 VID 找到点的语句性能最高,例如DELETE xxx WHERE id(xxx) == "player100",或者GO FROM "player100"等语句。

  • 通过属性先查找 VID,再进行图操作的性能会变差,例如LOOKUP | GO FROM $-.ids等语句,相比前者多了一次内存或硬盘的随机读(LOOKUP)以及一次序列化(|)

3、VID 生成建议,VID 的生成工作完全交给应用端,有一些通用的建议:

  • (最优)通过有唯一性的主键或者属性来直接作为 VID;属性访问依赖于 VID;
  • 通过有唯一性的属性组合来生成 VID,属性访问依赖于属性索引。
  • 通过 snowflake 等算法生成 VID,属性访问依赖于属性索引;
  • 如果个别记录的主键特别长,但绝大多数记录的主键都很短的情况,不要将FIXED_STRING(<N>)的N设置成超大,这会浪费大量内存和硬盘,也会降低性能。此时可通过 BASE64,MD5,hash 编码加拼接的方式来生成。如果用 hash 方式生成 int64 VID:在有 10 亿个点的情况下,发生 hash 冲突的概率大约是 1/10。边的数量与碰撞的概率无关。

4、定义和修改 VID 与其数据类型

  • VID 的数据类型必须在创建图空间时定义,且一旦定义无法修改。

  • VID 必须在插入点时设置,且一旦设置无法修改。

5、“查询起始点”(start vid) 与全局扫描

  • 绝大多数情况下,Nebula Graph 的查询语句(MATCH、GO、LOOKUP)的执行计划,必须要通过一定方式找到查询起始点的 VID(start vid)。定位 start vid 只有两种方式:
    • 例如 GO FROM "player100" OVER 是在语句中显式的指明 start vid 是 "player100"

    • 例如 LOOKUP ON player WHERE player.name == "Tony Parker" 或者 MATCH (v:player {name:"Tony Parker"}),是通过属性 player.name 的索引来定位到 start vid;

6、架构

这部分直接看官网文档:https://docs.nebula-graph.com.cn/3.1.0/1.introduction/3.nebula-graph-architecture/2.meta-service/,分为三部分,每个服务运行在单独的进程

  • Meta服务:鉴权、分片管理、图空间管理、Schema 管理等
  • Graph服务:Graph 服务主要负责处理查询请求,包括解析查询语句、校验语句、生成执行计划以及按照执行计划执行四个大步骤,本文将基于这些步骤介绍 Graph 服务。
  • Storage服务:Nebula Graph 的存储包含两个部分,一个是 Meta 相关的存储,称为 Meta 服务。另一个是具体数据相关的存储,称为 Storage 服务。

在这里插入图片描述

其中存储结构图示
在这里插入图片描述

二、初步使用

1、Windows安装Nebula-Graph服务

因为我的服务器到期了,因此在本地windows使用docker compose来进行安装。

参考安装步骤:https://www.jianshu.com/p/1c939f86357b

docker compose安装nebula的步骤官网中文手册:https://docs.nebula-graph.com.cn/3.1.0/,https://docs.nebula-graph.com.cn/3.1.0/4.deployment-and-installation/2.compile-and-install-nebula-graph/3.deploy-nebula-graph-with-docker-compose/

在这里插入图片描述

1、在windows上安装docker desktop之后包含了docker compose,保证本地安装过git即可

在这里插入图片描述

在这里插入图片描述

2、使用git bush打开自定义的目录位置,然后选择指定版本clone到本地,如果克隆失败可以直接下载压缩包到本地

在这里插入图片描述

# clone nebula-docker-compose,失败的话可以直接代开git仓库,然后下载zip解压也可
$ git clone -b release-3.1 https://github.com/vesoft-inc/nebula-docker-compose.git

# 切换到指定目录,使用命令行工具打开
$ cd nebula-docker-compose/


# 下面这个命令失败可以多试几次,推荐使用powershell
$ docker-compose up -d


在这里插入图片描述
3、执行到此步就已安装完成,查看安装的Nebula相关服务,可以看到

  • nebula-docker-compose-310_console_1:命令行连接工具
  • nebula-docker-compose-310_graphd xxx _1
  • nebula-docker-compose-310_metad xxx _1
  • nebula-docker-compose-310_storaged xxx _1

在这里插入图片描述
4、查看服务状态和端口,想要修改的话直接修改docker-compose.yaml配置文件即可

在这里插入图片描述

在这里插入图片描述

2、 Nebula Console 连接Nebula-Graph

1、使用docker exec -it nebula-docker-compose-310_console_1 /bin/sh进入容器内部
在这里插入图片描述

2、通过 Nebula Console 连接 Nebula Graph。执行命令./usr/local/bin/nebula-console -u root -p renyi --address=graphd --port=9669。默认情况下,身份验证功能是关闭的,用户可以使用 root 用户名和任意密码连接到 Nebula Graph。

在这里插入图片描述

3、打开登录连接密码

参考:https://docs.nebula-graph.com.cn/3.1.0/7.data-security/1.authentication/1.authentication/

在这里插入图片描述
4、停止服务命令:docker-compose down

在这里插入图片描述

3、常用命令

首先看支持的基本数据结构类型
在这里插入图片描述

3.1 异步实现创建修改类型

创建

  • CREATE SPACE:创建图空间
  • CREATE TAG:创建点标签,包含多个kv属性键值对
  • CREATE EDGE:创建边

修改,图空间一旦创建不可修改

  • ALTER TAG
  • ALTER EDGE
  • CREATE TAG INDEX
  • CREATE EDGE INDEX
(1)nGQL创建和选择spaces图空间

# 模板
CREATE SPACE [IF NOT EXISTS] <graph_space_name> (
[partition_num = <partition_number>,]
[replica_factor = <replica_number>,]
vid_type = {FIXED_STRING(<N>) | INT64}
)

[COMMENT = '<comment>'];

# 创建举栗
CREATE SPACE basketballplayer(
	partition_num=15, 
	replica_factor=1, 
	vid_type=fixed_string(30)
);

# 查看所有图空间
show spaces

# 选中某个图空间
use xxx


在这里插入图片描述

(2)nGQL创建 Tag标签 和 Edge type边类型

创建、删除、修改Tag等操作参考官网文档:https://docs.nebula-graph.com.cn/3.1.0/3.ngql-guide/10.tag-statements/1.create-tag/

创建、删除、修改Edge Type等操作参考官网文档:https://docs.nebula-graph.com.cn/3.1.0/3.ngql-guide/11.edge-type-statements/1.create-edge/

# 创建模板汇总
CREATE 
	{TAG | EDGE} 
	[IF NOT EXISTS] 
	{<tag_name> | <edge_type_name>}
    (
      <prop_name> <data_type> [NULL | NOT NULL] [DEFAULT <default_value>] [COMMENT '<comment>']
      [{, <prop_name> <data_type> [NULL | NOT NULL] [DEFAULT <default_value>] [COMMENT '<comment>']} ...] 
    )
    [TTL_DURATION = <ttl_duration>]
    [TTL_COL = <prop_name>]
    [COMMENT = '<comment>'];

以创建Tag参数举栗,CREATE TAG语句可以通过指定名称创建一个 Tag。

  • nGQL 中的 Tag 需要使用CREATE TAG语句独立创建。
  • Tag 更像是 MySQL 中的表。
  • 执行CREATE TAG语句需要当前登录的用户拥有指定图空间的创建 Tag 权限,否则会报错。
CREATE TAG 
	[IF NOT EXISTS] # 检测待创建的 Tag 是否存在,只有不存在时,才会创建 Tag。仅检测 Tag 的名称,不会检测具体属性。
	<tag_name> # 每个图空间内的 Tag 必须是唯一的。Tag 名称设置后无法修改。
	# Tag 名称以英文字母开头,支持 1~4 字节的 UTF-8 编码字符,包括英文字母(区分大小写)、数字、中文等,但是不包括除下划线外的特殊字符。使用特殊字符或保留关键字时,需要用反引号(`)包围,详情参见关键字和保留字。
    (
      <prop_name> # 属性名称。每个 Tag 中的属性名称必须唯一。属性的命名规则与 Tag 相同。
      <data_type> # 属性的数据类型,目前支持数值、布尔、字符串以及日期与时间。
      [NULL | NOT NULL] # 指定属性值是否支持为NULL。默认值为NULL。
      [DEFAULT <default_value>] # 指定属性的默认值。默认值可以是一个文字值或 Nebula Graph 支持的表达式。如果插入点时没有指定某个属性的值,则使用默认值。
      [COMMENT '<comment>'] # 对单个属性或 Tag 的描述说明。最大为 256 字节。默认无描述。
      # 省略
      [{, <prop_name> <data_type> [NULL | NOT NULL] [DEFAULT <default_value>] [COMMENT '<comment>']} ...] 
    )
    [TTL_DURATION = <ttl_duration>]
    [TTL_COL = <prop_name>]
    [COMMENT = '<comment>'];

举栗创建Tag

nebula> CREATE TAG IF NOT EXISTS player(name string, age int);

# 创建没有属性的 Tag。
nebula> CREATE TAG IF NOT EXISTS no_property(); 

# 创建包含默认值的 Tag。
nebula> CREATE TAG IF NOT EXISTS player_with_default(name string, age int DEFAULT 20);

# 对字段 create_time 设置 TTL 为 100 秒。
nebula> CREATE TAG IF NOT EXISTS woman(name string, age int, \
        married bool, salary double, create_time timestamp) \
        TTL_DURATION = 100, TTL_COL = "create_time";

举栗创建EdgeType

nebula> CREATE EDGE IF NOT EXISTS follow(degree int);

# 创建没有属性的 Edge type。
nebula> CREATE EDGE IF NOT EXISTS no_property();

# 创建包含默认值的 Edge type。
nebula> CREATE EDGE IF NOT EXISTS follow_with_default(degree int DEFAULT 20);

# 对字段 p2 设置 TTL 为 100 秒。
nebula> CREATE EDGE IF NOT EXISTS e1(p1 string, p2 int, p3 timestamp) \
        TTL_DURATION = 100, TTL_COL = "p2";

在这里插入图片描述

(3)nGQL插入点和边

用户可以使用INSERT语句,基于现有的 Tag 插入点,或者基于现有的 Edge type 插入边。

# 插入点模板

INSERT VERTEX # 
	[IF NOT EXISTS] # 仅检测 VID + Tag 的值是否相同,不会检测属性值。 IF NOT EXISTS 会先读取一次数据是否存在,因此对性能会有明显影响。
	[tag_props, [tag_props] ...]
VALUES 
	<vid>: ([prop_value_list]) #vid是 Vertex ID 的缩写,vid在一个图空间中是唯一的。
	# 参数详情请参见:https://docs.nebula-graph.com.cn/3.1.0/3.ngql-guide/12.vertex-statements/1.insert-vertex/


# 说明
tag_props:
  tag_name ([prop_name_list])

prop_name_list:
   [prop_name [, prop_name] ...]

prop_value_list:
   [prop_value [, prop_value] ...]  


# 举栗

# 1.  插入一个点player100,包含标签player以及对应的值
(root@nebula) [basketballplayer]> INSERT VERTEX player(name, age) VALUES 
	"player100":("Tim Duncan", 42);


# 2.  插入一个点player101,包含标签player以及对应的值
(root@nebula) [basketballplayer]> INSERT VERTEX player(name, age) VALUES 
	"player101":("Tony Parker", 36);


# 3.  插入一个点player102,包含标签player以及对应的值
(root@nebula) [basketballplayer]> INSERT VERTEX player(name, age) VALUES 
	"player102":("LaMarcus Aldridge", 33);


# 1.  插入两个点team203、team204,包含标签team以及对应的值
(root@nebula) [basketballplayer]>  INSERT VERTEX team(name) VALUES 
	"team203":("Trail Blazers"), 
	"team204":("Spurs");

# 插入边模板

INSERT EDGE 
	[IF NOT EXISTS] 
	<edge_type> 
	( <prop_name_list> ) 
VALUES 
	<src_vid> -> <dst_vid>[@<rank>] : ( <prop_value_list> )
	[, <src_vid> -> <dst_vid>[@<rank>] : ( <prop_value_list> ), ...];

# 说明
<prop_name_list> ::=
[ <prop_name> [, <prop_name> ] ...]

<prop_value_list> ::=
[ <prop_value> [, <prop_value> ] ...]


# 举栗
# 1. 插入一条 点player101->点player100 类型为follow的边,权值为95
(root@nebula) [basketballplayer]> INSERT EDGE follow(degree) VALUES "player101" -> "player100":(95);

# 2. 插入一条 player101->player102 类型为follow的边,权值为90
(root@nebula) [basketballplayer]> INSERT EDGE follow(degree) VALUES "player101" -> "player102":(90);

# 3. 插入一条 player102->player100 类型为follow的边,权值为75
(root@nebula) [basketballplayer]> INSERT EDGE follow(degree) VALUES "player102" -> "player100":(75);


(root@nebula) [basketballplayer]> INSERT EDGE serve(start_year, end_year) VALUES 
	"player101" -> "team204":(1999, 2018), #  插入一条 点player101->点team204 类型为server 的边,属性值为(1999, 2018)
	"player102" -> "team203":(2006,  2015); # 插入一条 点player102->点team203 类型为server 的边,属性值为(2006,  2015)

(4)简单查询数据

支持下列四种语句

  • GO 语句可以根据指定的条件遍历数据库。GO语句从一个或多个点开始,沿着一条或多条边遍历,返回YIELD子句中指定的信息。
  • FETCH 语句可以获得点或边的属性。
  • LOOKUP 语句是基于索引的,和WHERE子句一起使用,查找符合特定条件的数据。
  • MATCH 语句是查询图数据最常用的,可以灵活的描述各种图模式,但是它依赖索引去匹配 Nebula Graph 中的数据模型,性能也还需要调优。
1、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>];

举栗1:从 VID 为player101的球员开始,沿着边follow找到连接的球员: GO FROM "player101" OVER follow YIELD id($$);

在这里插入图片描述
举栗2:从 VID 为player101的球员开始,沿着边follow查找年龄大于或等于 35 岁的球员,并返回他们的姓名和年龄,同时重命名对应的列:

GO FROM "player101" 
OVER follow 
WHERE properties($$).age >= 35 
YIELD 
	properties($$).name AS Teammate, 
	properties($$).age AS Age;

# YIELD	指定该查询需要返回的值或结果。
# $$	表示边的终点。
# \	表示换行继续输入。

在这里插入图片描述

举栗3:从 VID 为player101的球员开始,沿着边follow查找连接的球员,然后检索这些球员的球队。为了合并这两个查询请求,可以使用管道符或临时变量。

GO FROM "player101" 
OVER follow 
YIELD dst(edge) AS id 
	| GO FROM $-.id 
	  OVER serve 
	  YIELD properties($$).name AS Team, properties($^).name AS Player;
	  
+-----------------+---------------------+
| Team            | Player              |
+-----------------+---------------------+
| "Spurs"         | "Tim Duncan"        |
| "Trail Blazers" | "LaMarcus Aldridge" |
| "Spurs"         | "LaMarcus Aldridge" |
| "Spurs"         | "Manu Ginobili"     |
+-----------------+---------------------+


# $^	表示边的起点。
# |		组合多个查询的管道符,将前一个查询的结果集用于后一个查询。
# $-	表示管道符前面的查询输出的结果集。

举栗4:使用临时变量

# 当复合语句作为一个整体提交给服务器时,其中的临时变量会在语句结束时被释放。
$var = 
		GO FROM "player101" 
		OVER follow 
		YIELD dst(edge) AS id; 
		
GO FROM  $var.id 
OVER serve 
YIELD properties($$).name AS Team, properties($^).name AS Player;

+-----------------+---------------------+
| Team            | Player              |
+-----------------+---------------------+
| "Spurs"         | "Tim Duncan"        |
| "Trail Blazers" | "LaMarcus Aldridge" |
| "Spurs"         | "LaMarcus Aldridge" |
| "Spurs"         | "Manu Ginobili"     |
+-----------------+---------------------+
2、FETCH查询语句
# 查询 Tag 属性
FETCH PROP ON 
	{<tag_name>[, tag_name ...] | *}
	<vid> [, vid ...]
YIELD 
	<return_list> [AS <alias>];


#查询边属性
FETCH PROP ON 
	<edge_type> <src_vid> -> <dst_vid>[@<rank>] 
	[, <src_vid> -> <dst_vid> ...]
YIELD 
	<output>;

举栗

# 查询 VID 为player100的球员的属性。
FETCH PROP ON 
	player "player100" 
YIELD properties(vertex);

+-------------------------------+
| properties(VERTEX)            |
+-------------------------------+
| {age: 42, name: "Tim Duncan"} |
+-------------------------------+
3、LOOKUP查询语句
LOOKUP ON {<vertex_tag> | <edge_type>}
[WHERE <expression> [AND <expression> ...]]
YIELD <return_list> [AS <alias>];

<return_list>
    <prop_name> [AS <col_alias>] [, <prop_name> [AS <prop_alias>] ...];

基于索引的LOOKUP举栗,确保LOOKUP有一个索引可用。如果没有,请先创建索引。


# 找到 Tag 为player的点的信息,它的name属性值为Tony Parker。


// 为 name 属性创建索引 player_index_1。
nebula> CREATE TAG INDEX IF NOT EXISTS player_index_1 ON player(name(20));

// 重建索引确保能对已存在数据生效。
REBUILD TAG INDEX player_index_1
+------------+
| New Job Id |
+------------+
| 31         |
+------------+

// 使用 LOOKUP 语句检索点的属性。
LOOKUP ON player 
WHERE player.name == "Tony Parker" 
YIELD properties(vertex).name AS name, properties(vertex).age AS age;
+---------------+-----+
| name          | age |
+---------------+-----+
| "Tony Parker" | 36  |
+---------------+-----+
4、MATCH查询语句

基于索引的MATCH举栗,确保MATCH有一个索引可用。如果没有,请先创建索引。

MATCH <pattern> [<clause_1>]  
RETURN <output>  [<clause_2>];

举栗

# 找到 Tag 为player的点的信息,它的name属性值为Tony Parker。

// 使用 MATCH 语句检索点的属性。
MATCH (v:player{name:"Tony Parker"})
RETURN v;
+-----------------------------------------------------+
| v                                                   |
+-----------------------------------------------------+
| ("player101" :player{age: 36, name: "Tony Parker"}) |
+-----------------------------------------------------+

其他更多命令参考官网文档:https://docs.nebula-graph.com.cn/3.1.0/2.quick-start/6.cheatsheet-for-ngql-command/

4、Docker 部署连接工具 Studio

参考官网文档:https://docs.nebula-graph.com.cn/3.1.0/nebula-studio/deploy-connect/st-ug-deploy/,下载比较慢的可以为docker配置国内镜像源参考:https://blog.csdn.net/seantdj/article/details/106372955

在命令行工具中按以下步骤依次运行命令,部署并启动 Docker 版 Studio,这里我们用 Nebula Graph 版本为 3.1.0 的进行演示:

  1. 下载 Studio 的部署配置文件。安装包 适用 Nebula 版本3.1.0 nebula-graph-studio-3.3.1.tar.gz

  2. 创建nebula-graph-studio-3.3.1目录,并将安装包解压至目录中。mkdir nebula-graph-studio-3.3.1 && tar -zxvf nebula-graph-studio-3.3.1.tar.gz -C nebula-graph-studio-3.3.1

  3. 解压后进入 nebula-graph-studio-3.3.1 目录。cd nebula-graph-studio-3.3.1 拉取 Studio 的 Docker 镜像。docker-compose pull
    构建并启动 Studio 服务。其中,-d 表示在后台运行服务容器。docker-compose up -d
    在这里插入图片描述

  4. 当屏幕返回以下信息时,表示 Docker 版 Studio 已经成功启动。启动成功后,在浏览器地址栏输入 http://<ip address>:7001。需要找到本机的IPv4地址,可以使用ipconfig或者设置查看。连接参考官方文档:https://docs.nebula-graph.com.cn/3.1.0/nebula-studio/deploy-connect/st-ug-connect/

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

三、整合SpringBoot使用

完整整合代码放到了github:https://github.com/sichaolong/spring-demo/tree/main/springboot-nebula-graph-demo

参考官方文档:https://docs.nebula-graph.com.cn/3.1.0/14.client/1.nebula-client/

Java客户端使用文档:https://docs.nebula-graph.com.cn/3.1.0/14.client/4.nebula-java-client/

新建一个SpringBoot工程,注意不要使用aliyun的仓库,它的仓库还没有新的nebula的客户端依赖,pom文件添加响应的依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.7</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>henu.soft</groupId>
    <artifactId>study_nebula_graph_demo</artifactId>
    <version>0.0.1</version>
    <name>study_nebula_graph_demo</name>
    <description>SpringBoot整合nebula图数据库</description>
    <properties>
        <java.version>11</java.version>
    </properties>
    <dependencies>


<!--        nebula客户端-->
        <dependency>
            <groupId>com.vesoft</groupId>
            <artifactId>client</artifactId>
            <version>3.0.0</version>
        </dependency>

<!--        fastjson-->

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.78</version>
        </dependency>



        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>



        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

   
</project>

参考官方给的demo代码,编写测试代码

package henu.soft.study_nebula_graph_demo;

import com.vesoft.nebula.client.graph.NebulaPoolConfig;
import com.vesoft.nebula.client.graph.data.HostAddress;
import com.vesoft.nebula.client.graph.exception.AuthFailedException;
import com.vesoft.nebula.client.graph.exception.ClientServerIncompatibleException;
import com.vesoft.nebula.client.graph.exception.IOErrorException;
import com.vesoft.nebula.client.graph.exception.NotValidConnectionException;
import com.vesoft.nebula.client.graph.net.NebulaPool;
import com.vesoft.nebula.client.graph.net.Session;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.List;

@SpringBootTest
@Slf4j
public class NebulaDemoTest {

    @Test
    void testNebulaConnection(){

        log.info("开始连接nebula数据库....");

        NebulaPool pool = new NebulaPool();
        Session session;
        try {
            NebulaPoolConfig nebulaPoolConfig = new NebulaPoolConfig();
            nebulaPoolConfig.setMaxConnSize(100);
            List<HostAddress> addresses = Arrays.asList(new HostAddress("127.0.0.1", 9669));
            Boolean initResult = pool.init(addresses, nebulaPoolConfig);

            if (!initResult) {
                log.error("pool init failed.");
                return;
            }
            session = pool.getSession("root", "nebula", false);
            boolean pingRes = session.ping();
            log.info("ping 结果为 :{}",pingRes);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (NotValidConnectionException e) {
            e.printStackTrace();
        } catch (AuthFailedException e) {
            e.printStackTrace();
        } catch (ClientServerIncompatibleException e) {
            e.printStackTrace();
        } catch (IOErrorException e) {
            e.printStackTrace();
        }

    }
}

打印结果为

在这里插入图片描述

举栗练习

1.命令行先查看数据库数据

使用之前创建的basketballplayer图空间
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

# 1. 查找包含player标签的点
match (v:player) return v limit 10

# 2. 查找包含team标签的点
match (v:team) return v limit 10


# 3. 查找所有点的边关系
match ()<-[e]-() return e limit 10

2.执行新增点测试方法

完整代码已经放在github上:https://github.com/sichaolong/spring-demo/tree/main/springboot-nebula-graph-demo

package henu.soft.study_nebula_graph_demo;

import com.vesoft.nebula.client.graph.exception.IOErrorException;
import henu.soft.study_nebula_graph_demo.pojo.Info;
import henu.soft.study_nebula_graph_demo.utils.NebulaTemplate;
import henu.soft.study_nebula_graph_demo.vo.NebulaResult;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

@SpringBootTest
@Slf4j
public class NebulaTemplateTest {

	// NebulaTemplate 是为了方便获取session执行封装的工具类。仓库地址:https://github.com/sichaolong/study-nebula_graph_demo
    @Resource
    NebulaTemplate nebulaTemplate;

    @Test
    void addJSON() throws IOErrorException {
        log.info("开始像图空间添加一个点...[ v: {},name: {},age: {} ]","player103","xiaosi","21");

        String sql = "INSERT VERTEX player(name, age) VALUES \n" +
                "\t\"player103\":(\"xiaosi\", 21);";
        NebulaResult nebulaResult = nebulaTemplate.executeObject(sql);
        log.info("添加结果:{}",nebulaResult.toString());

    }


   
}

3.查看执行结果

在这里插入图片描述

命令行查询数据库,发现成功添加

(root@nebula) [basketballplayer]> match (v:player) return id(v) as id,v.player.name as name,v.player.age as age limit 10;
+-------------+---------------------+-----+
| id          | name                | age |
+-------------+---------------------+-----+
| "player101" | "Tony Parker"       | 36  |
| "player102" | "LaMarcus Aldridge" | 33  |
| "player103" | "xiaosi"            | 21  |
| "player100" | "Tim Duncan"        | 42  |
+-------------+---------------------+-----+
4.执行查询点测试方法

查询包含player标签的所有点,其中player是自定义的pojo,包含id、name、age属性, NebulaResult<T>是封装的返回查询结果类,返回的数据在data中


@Test
    void findJson2() throws IOErrorException {
        // lookup 至少需要一个索引
        // String sql = "lookup on player  yield id(vertex) AS id,properties(vertex).name AS name,properties(vertex).age AS age;";

        String sql = "match (v:player) return id(v) as id,v.player.name as name,v.player.age as age limit 10;";
        NebulaResult<player> playerInfoNebulaResult = nebulaTemplate.queryObject(sql, player.class);
        log.info("查询包含player标签的所有点:{}" ,playerInfoNebulaResult.toString());
    }

// 输出
/* NebulaResult(
	code=0, 
	message=null, 
	data=[	player(id=player101, name=Tony Parker, age=36), 
			player(id=player102, name=LaMarcus Aldridge, age=33), 
			player(id=player103, name=xiaosi, age=21), 
			player(id=player100, name=Tim Duncan, age=42)
		]
)
*/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nebula Graph学习篇1_基础概念、初步使用、整合SpringBoot使用 的相关文章

  • 单片机中堆栈那些事儿

    堆栈是内存中一段连续的存储区域 xff0c 用来保存一些临时的数据 xff0c 比如 xff0c 可以保存中断指令INT中的标志寄存器值 代码段寄存器CS值 指令指针寄存器IP值 xff1b 还可以用以RET指令从中可以得到返回的地址 xf
  • udp 通信

    1 char strtok char str const char delim 功能 xff1a 对字符串进行切割 参数 xff1a str 要切割的字符串的首地址 delim 切割的规则 返回值 xff1a 切割后字符串的首地址 2 ud
  • Unix网络编程 Ubuntu20.04.2 Visual Studio Code

    Visual Studio Code 说明 1 本文中 表示下一步 下一级菜单和修改为 xff0c 需根据上下文理解 一 环境配置 1 安装gcc g 43 43 和gdb span class token function sudo sp
  • 基于Jetson NX的模型部署

    系统安装 系统安装过程分为3步 xff1a 下载必要的软件及镜像 Jetson Nano Developer Kit SD卡映像 https developer nvidia com jetson nano sd card image Wi
  • C51单片机学习笔记——秒表

    前言 不知不觉我又被自己的惰性拖住了小一个月 xff0c 今天在宿舍窗边吸烟时候 xff0c 看着楼下人来人往的道路不由自主的感到一丝惭愧 xff0c 手里的小视频也被我刷出来一条鸡汤 xff0c 在这儿我要写下来记录给将来又在颓废的我 x
  • arduino学习——UART串口通信

    Serial begin 初始化串口 用作串口的启动 xff0c 常放置在setup xff08 xff09 中 原型 xff1a Serial begin speed Serial begin speed config 参数 xff1a
  • arduino学习——servo类 控制舵机

    硬件 WeMos D1平台 43 SG90舵机 SG90舵机相关介绍 xff1a 角度 xff1a 90度 180度通用 红色为5V电源线 xff0c 棕色为地线 xff0c 橙色为信号线 无负载转速 xff1a 0 12秒 60度 xff
  • DSP28335笔记 ———— 中断系统 之 外部中断

    DSP28335笔记 中断系统 之 外部中断 我用的开发板是 硬汉DSP28335开发板 xff0c 文中对于硬件的描述可以说是没有 xff0c 而且我还没有附上电路图希望在看的朋友不要喷我 然后 xff0c 我个人感觉普中的DSP2833
  • DSP28335笔记 —— 定时器

    DSP28335笔记 定时器 相比于STM32 xff0c DSP28335的定时器好像真的简单了好多 xff0c 从定时器个数来讲只有3个 xff0c 时钟源只能是系统时钟 xff0c 而且计数方向也只有向下计数 单纯且善良的定时器 xf
  • C语言线程基本函数

    学习笔记 xff1a C语言线程基本函数 学习内容 xff1a 线程常用基本函数 xff1a pthread create 创建线程pthread exit 退出当前线程pthread join 等待其他线程结束pthread self 自
  • 《大话设计模式》笔记——简单工厂模式

    前言 我 xff08 长胖的阿诏 xff09 是新入行的嵌入式程序员 xff0c 所以用C语言做示例演示 xff0c 我看到书上都是 C 语言的代码 xff0c 所以我只能先领会精神 xff0c 再通过C语言复刻 在我的资源里好像没有见过用
  • 《大话设计模式》笔记——策略模式

    策略模式 34 我 34 的理解 策略模式 是指同一个对象在不同情况下的策略行为有所差异 xff0c 继续以之前的四则运算为例 加 减 乘 除 就是两个参数在不同情况下计算过程的差异性行为 所以在某种程度上 xff0c 策略模式可能比简单工
  • md文件目录生成器

    md文件目录生成器 目录 md文件目录生成器 md文件目录生成器 step1 下载脚本文件 step1 下载脚本文件 step2 生成脚本文件 step2 生成脚本文件 step3 设置环境变量 step3 设置环境变量 step4 可以用
  • Python __file__ 详解

    这个功能纠结了一下午 xff0c 做了测试以后总算是明白了 file 表示显示文件当前的位置 但是 xff1a 如果当前文件包含在sys path里面 xff0c 那么 xff0c file 返回一个相对路径 xff01 如果当前文件不包含
  • 48.HTTP基本认证与摘要认证

    文章目录 基本认证摘要认证 转载请注明原始出处 xff1a http blog csdn net a464057216 article details 52705855 后续此博客不再更新 xff0c 欢迎大家搜索关注微信公众号 测开之美
  • CircleProgressBar 圆形进度条,支持多种属性

    效果图 xff1a xff0c 直接从新项目里面摘出来的 xff0c 给自己做个记录 所以就不多加说明 xff0c 1 自定义控件 xff1a 网上摘录修改 public class CircleProgressBar extends Vi
  • c语言入门这一篇就够了-学习笔记(一万字)

    内容来自慕课网 xff0c 个人学习笔记 加上了mtianyan标签标记知识点 C语言入门 gt Linux C语言编程基本原理与实践 gt Linux C语言指针与内存 gt Linux C语言结构体 https www imooc co
  • GPS接收机(一)概述

    概述 接下来的几篇博客包括如下内容 1 xff0c 圆极化天线 xff1a 包括圆极化天线的设计 xff0c 场路协同仿真 xff08 电磁场和电路 xff09 xff0c 相位中心的计算 2 xff0c 低噪放 xff1a 包括低噪放的设
  • ERROR: invalid message type: fl_com/sensor_connect_state. If this is a valid message type, perhaps y

    ERROR invalid message type fl com sensor connect state If this is a valid message type perhaps you need to type rosmake
  • libcurl进行post

    libcurl进行post main函数 xff0c 初始化和清理curl 全局初始化curl curl global init CURL GLOBAL ALL std string url 61 34 http xxxx 34 std s

随机推荐

  • STL几个容器的比较

    vector xff1a 连续内存 xff0c 随机访问数据成员快 xff0c 但是频繁的插入 xff08 需要移动要插入的元素的后面的所有元素 xff09 或者扩容 vector扩容后会清掉原来的数据 xff0c 拷贝到新的申请的大的内存
  • STL注意问题

    1 由于继承的存在 xff0c 拷贝会导致分割 那就是说 xff0c 如果你以基类对象建立一个容器 xff0c 而你试图插入派生类对象 xff0c 那么当对象 xff08 通过基类的拷贝构造函数 xff09 拷入容器的时候对象的派生部分会被
  • CAN总线通信协议详讲

    CAN简介 CAN是Controller Area Network 的缩写 xff08 以下称为CAN xff09 xff0c 是ISO国际标准化的串行通信协议 由德国电气商博世公司在1986 年率先提出 此后 xff0c CAN 通过IS
  • gazebo仿真——controller配置(transmission/hardwareInterface标签)

    参考roswiki controller官方说明 本文作为古月大神的补充ROS探索总结 xff08 三十一 xff09 ros control 为了在gazebo中实现机器人关节的控制 xff0c 需要求建立一个controller控制器
  • NDK--CMakeLists配置第三方so库

    当我们创建一个NDK工程时 xff0c 会自动创建一个CMakeLists txt的文件 xff0c 在AS中c 43 43 的编译器是使用LLVM xff0c 规则为cmake xff0c 今天来学习下cmake的基本套路 首先 xff0
  • postman插件下载安装教程(详细)

    一 前言 postman是一款强大网页接口调试工具 xff0c 我们在平时开发过程中经常会使用到 xff0c 一般使用最多的是postman的客户端 xff0c 实际上postman在谷歌浏览器上也提供了插件 xff0c 可以不必要安装客户
  • CMake交叉编译简单教程

    首先要安装cmaek 然后安装交叉编译链 一 CMake简介 xff1a CMake是一个跨平台的安装 编译 工具 可以通过简单的语句来描述所有平台的安装 编译过程 他能够输出各种各样的 makefile 或者 project 文件 二 C
  • 锂电池的常见接口

    我们在做一些小型化便携式设备的时候 xff0c 经常会用到锂电池 xff0c 常见的锂电池接口如图 xff1a
  • Ubuntu14.04_ROS学习笔记(7) odroid板上操作系统和电脑端主从连接

    4 29日 xff0c 距离上次写过于odroid ROS的博客已经过去近4周 xff0c 在这四周发生了很多曲折事 xff0c 研究生的调剂和面试问题 xff0c 导师双向选择也出现了问题 xff0c 调档问题 xff0c 然后和GF出去
  • ROS学习----Publisher与Subscriber

    1 Publisher 发布者 与subscriber 订阅者 关系 Publisher的主要作用是对于指定话题发布特定数据类型的消息 下面是利用代码实现一个节点 xff0c 节点创建一个Publisher并发布字符串 Hello worl
  • liunx 下如何查看make与cmake版本

    cmake cmake version 即可查看cmake的版本 make 如果是在 shell 中查看 xff0c 那么直接 make v 即可 如果是在 makefile 中获取 xff0c 则用 MAKE VERSION xff0c
  • CAN协议解析

    CAN协议解析 CAN 总线组网连线图CAN的报文格式报文格式扩展CAN错误检测 波形解析ID数据长度数据字段CRC CAN 总线组网连线图 根据CAN总线的硬件特性 xff0c 当一条CAN总线上挂接多个驱动器的时候 xff0c 应当按照
  • 字节序的大端和小端

    字节序 字节序 xff08 Byte Order xff09 是指在多字节的数据类型 xff08 如整型 浮点型等 xff09 在内存中存储时 xff0c 字节的排列顺序 大端字节序 xff08 Big Endian xff09 xff1a
  • STM32 HAL 串口收发(无DMA,中断接收)

    STM32CUBE配置 一 使用printf发送数据 xff0c 在usart c中添加代码串口重定向 USER CODE BEGIN 0 include lt stdio h gt ifdef GNUC define PUTCHAR PR
  • 2019年电赛综合测评题详解

    2019年全国大学生电子设计竞赛综合测评已经结束 xff0c 邀请到西电研究生李天红同学给大家做重点分析 首先看题目 xff1a 视频要点提示 xff1a 题目分析 常用波形变换电路 两种可行方案 方案仿真 实际过程中遇到的问题分析 完整视
  • 《Spring源码深度解析 郝佳 第2版》SpringBoot体系分析、Starter的原理

    往期博客 Spring源码深度解析 郝佳 第2版 容器的基本实现与XML文件的加载 Spring源码深度解析 郝佳 第2版 XML标签的解析 Spring源码深度解析 郝佳 第2版 bean的加载 循环依赖的解决 Spring源码深度解析
  • SpringCloud Alibaba Nacos实践与原理分析

    目录 一 Nacos概述 Nacos是什么 xff1f Nacos中的相关概念 二 微服务的注册与发现 Nacos client提供注册接口的原理 服务注册的原理分析服务注册的时机分析NacosServiceRegistryAutoConf
  • Linux课堂篇3_Linux目录结构、快捷键、常用基础命令

    目录 此系列博客为大三下期末小学期课程大数据疫情分析平台项目学习学习笔记 xff0c 内容参考中共教育讲义文件 Linux目录结构Linux快捷键Linux命令 命令分类快捷键基本命令常用命令用户管理命令文件权限命令磁盘大小查看命令搜索查找
  • 《深入理解RPC框架原理与实现 华钟明》读书笔记

    前言 这本书更像是全面系统的讲解RPC xff0c 内容可以连贯起来 xff0c 从计算机处理器发展到RPC的诞生 xff0c 后面讲几种常见的RPC组件 通信协议 序列化协议 xff0c 虽然内容不是很深入 xff0c 但是对于小白较易理
  • Nebula Graph学习篇1_基础概念、初步使用、整合SpringBoot使用

    目录 一 基础概念 图数据库的概念适用场景数据模型路径点的VID架构 二 初步使用 Windows安装Nebula Graph服务Nebula Console 连接 Nebula Graph常用命令 3 1异步实现创建修改类型 xff08