Nebula Graph介绍和SpringBoot环境连接和查询
转载请注明来源 https://www.cnblogs.com/milton/p/16784098.html
说明当前Nebula Graph的最新版本是3.2.1, 根据官方的文档进行配置https://docs.nebula-graph.io/3.2.1/14.client/4.nebula-java-client/
Nebula Graph 的一些特点
- 支持分布式. 相对于Neo4j, TigerGraph这些图数据库, Nebula 是面向分布式设计的, 因此对集群的支持比较完备, 在规模上上限要高很多. 在实际项目中存储了180亿的点边, 这个数量对于Neo4j和TigerGraph是比较困难的.
- 支持图空间. 各个图空间的ID是互不干扰的, 但是在同一个图空间里ID的类型和长度必须一致. 注意这个一致约束的是所有的点和边. Nebula 可以使用int64作为ID, 也可以用字符串, 但是字符串需要指定一个长度, 例如64个字节. 相对于只能用长整数的Neo4j, ID设计上更自由灵活.
- 点对应的类型叫TAG, 边对应的类型叫EDGE
- TAG和EDGE都会对应一组的属性(map, 或者说dict)
- 一个点可以对多个TAG, 每个TAG一组属性, 多组属性. 项目中建议一开始不要用多TAG, 在整个图结构稳定后, 再做合并
- 一个边只对应一个EDGE, 一组属性
- Nebula 用的是自定义的查询语法 GQL, 和 cypher 语法基本一样
- 除了点边的ID和关联关系外, 只有带索引的属性可以查询. 这点和其它图数据库不一样, 其它数据库即使没有索引, 慢是慢点但是不报错, Nebula直接给你返回错误.
- 对于返回数量较大的查询, Nebula会强制查询必须带limit
- Nebula 单节点稳定性是有问题的, 在3.2.1版本中观察到偶尔会出现服务自行退出, 如果在生产环境使用, 需要有后台监控进行心跳检测和自动启动
-- 列出图空间SHOW SPACES;-- 列出tag(点类型)和edge(边类型), 需要先 USE 一个图空间SHOW TAGS;SHOW EDGES;
列出某一类型的点和边MATCH ()-[e:follow]-() RETURN eMATCH (v:player) RETURN v
带条件的查询, 在结果数量较多时必须带limit, 否则Nebula会报错match (v:ADDRESS)-[e]-() where id(v)==\"ADD:82388116\" return v,e limit 100
基础配置和使用在上面的链接中, 提供了最小的配置和测试代码pom.xml 增加包依赖对于Nebula Graph 3.2.1, 需要使用3.0.0的版本. client的每个版本只能对应特定的一两个服务端版本
<dependency> <groupId>com.vesoft</groupId> <artifactId>client</artifactId> <version>3.0.0</version></dependency>
Java调用Java调用主要是三部分, 创建连接池, 创建会话, 执行查询创建 NebulaPool 连接池连接到地址127.0.0.1, 端口9669, 连接池大小100. 注意地址和端口是一个列表, Nebula是支持集群的. 连接时不需要用户和密码
NebulaPool pool = new NebulaPool();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; }} catch ()//...
创建 Session 会话创建会话时需要用户名和密码Session session = pool.getSession("root", "nebula", false);
执行查询创建一个SPACE, 然后使用这个SPACE, 创建一个TAG person, 创建一个EDGE likeString createSchema = "CREATE SPACE IF NOT EXISTS test(vid_type=fixed_string(20)); "+ "USE test;"+ "CREATE TAG IF NOT EXISTS person(name string, age int);"+ "CREATE EDGE IF NOT EXISTS like(likeness double)";ResultSet resp = session.execute(createSchema);if (!resp.isSucceeded()) { log.error(String.format("Execute: `%s', failed: %s",createSchema, resp.getErrorMessage())); System.exit(1);}
添加一个点记录String insertVertexes = "INSERT VERTEX person(name, age) VALUES "+ "'Bob':('Bob', 10), "+ "'Lily':('Lily', 9), "+ "'Tom':('Tom', 10), "+ "'Jerry':('Jerry', 13), "+ "'John':('John', 11);";ResultSet resp = session.execute(insertVertexes);if (!resp.isSucceeded()) { log.error(String.format("Execute: `%s', failed: %s",insertVertexes, resp.getErrorMessage())); System.exit(1);}
查询String query = "GO FROM \"Bob\" OVER like "+ "YIELD $^.person.name, $^.person.age, like.likeness";ResultSet resp = session.execute(query);if (!resp.isSucceeded()) { log.error(String.format("Execute: `%s', failed: %s",query, resp.getErrorMessage())); System.exit(1);}printResult(resp);
在 SpringBoot 项目中使用 Nebula Graphpom.xml 增加包依赖<dependency> <groupId>com.vesoft</groupId> <artifactId>client</artifactId> <version>3.0.0</version></dependency>
Session工厂: NebulaSessionFactory.java配合
推荐阅读
- iqoou3详细参数_iqoou3参数详细参数配置
- 三国杀玩法及卡牌介绍(三国杀108张牌明细)
- Go Micro介绍与入门
- 荣耀magic3有超级终端功能吗_超级终端功能介绍
- 我的世界信标怎么用,信标功能详细介绍(我的世界中的信标是怎么用的)
- 华为mate40的优点和缺点_华为mate40的优缺点介绍
- Go_Channel详解
- Docker 部署Kibana
- 谣言检测《Data Fusion Oriented Graph Convolution Network Model for Rumor Detection》
- Go的网络编程详解