iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Nebula Graph和SpringBoot环境连接及查询如何实现
  • 225
分享到

Nebula Graph和SpringBoot环境连接及查询如何实现

2023-07-06 12:07:12 225人浏览 薄情痞子
摘要

这篇文章主要讲解了“Nebula Graph和SpringBoot环境连接及查询如何实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Nebula Graph和sprin

这篇文章主要讲解了“Nebula Graph和SpringBoot环境连接及查询如何实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Nebula Graph和springBoot环境连接及查询如何实现”吧!

说明

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

当前Nebula Graph的最新版本是3.2.1, 根据官方的文档进行配置

  • 支持分布式. 相对于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版本中观察到偶尔会出现服务自行退出, 如果在生产环境使用, 需要有后台监控进行心跳检测和自动启动

GQL 常用查询

下面列出一些常用的查询

-- 列出图空间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 like

String 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 Graph

pom.xml 增加包依赖
<dependency><groupId>com.vesoft</groupId><artifactId>client</artifactId><version>3.0.0</version></dependency>
Session工厂: NebulaSessionFactory.java

配合@Bean(destroyMethod = "close"), 创建一个工厂类, 接收pool并实现close()方法

public class NebulaSessionFactory {    private final NebulaPool pool;    private final String username;    private final String passWord;    public NebulaSessionFactory(NebulaPool pool, String username, String password) {        this.pool = pool;        this.username = username;        this.password = password;    }    public Session getSession() {        try {            return pool.getSession(username, password, false);        } catch (NotValidConnectionException|IOErrorException|AuthFailedException|ClientServerIncompatibleException e) {            throw new RuntimeException("Nebula session exception", e);        }    }    public void close() {        pool.close();    }}

为什么不直接将 NebulaPool 配置为Bean? 因为 Session 每次创建时需要带用户名密码, 将密码作为config注入到每个Service中肯定是大家都不愿意看到的.

配置修改: application.yml
  • 这里的值如果不打算使用profile配置, 可以直接写入

  • hosts是逗号分隔的地址端口列表, 例如 10.22.33.33:9669,10.22.33.34:9669

myapp:  nebula:    hosts: @nebula.hosts@    username: @nebula.username@    password: @nebula.password@    max-conn: @nebula.max-conn@
Spring启动配置: NebulaGraphConfig.java

应用启动时读取配置, 创建 NebulaPool, 并实例化 NebulaSessionFactory, destroyMethod = "close", 这个表示在项目shutdown时会调用Bean的close方法释放资源.

@Configurationpublic class NebulaGraphConfig {    @Value("${myapp.nebula.hosts}")    private String hosts;    @Value("${myapp.nebula.max-conn}")    private int maxConn;    @Value("${myapp.nebula.username}")    private String username;    @Value("${myapp.nebula.password}")    private String password;    @Bean(destroyMethod = "close")    public NebulaSessionFactory nebulaSessionFactory() {        List<HostAddress> hostAddresses = new ArrayList<>();        String[] hostList = hosts.split(",[ ]*");        for (String host : hostList) {            String[] hostParts = host.split(":");            if (hostParts.length != 2 || !hostParts[1].matches("\\d+")) {                throw new RuntimeException("Invalid host name set for Nebula: " + host);            }            hostAddresses.add(new HostAddress(hostParts[0], Integer.parseInt(hostParts[1])));        }        NebulaPoolConfig poolConfig = new NebulaPoolConfig();        poolConfig.setMaxConnSize(maxConn);        NebulaPool pool = new NebulaPool();        try {            pool.init(hostAddresses, poolConfig);        } catch (UnknownHostException e) {            throw new RuntimeException("Unknown Nebula hosts");        }        return new NebulaSessionFactory(pool, username, password);    }}
Service调用

在 Service 中进行调用

@Service@Slf4jpublic class GraphServiceImpl implements GraphService {    @Autowired    private NebulaSessionFactory sessionFactory;    @Override    public <T> NebulaResult<T> query(String graphSpace, String gql) {        Session session = null;        try {            log.info("GQL: {}", gql);            session = sessionFactory.getSession();            NebulaResult<Void> res = query(session, "USE " + graphSpace);            if (!res.isSuccess() || res.getResults() == null || res.getResults().size() == 0) {                log.error("Failed to use space:{}", graphSpace);                return null;            }            if (!graphSpace.equals(res.getResults().get(0).getSpaceName())) {                log.error("Failed to use space:{}, result:{}", graphSpace, res.getResults().get(0).getSpaceName());                return null;            }            return query(session, gql);        } catch (IOErrorException e) {            log.error(e.getMessage(), e);            return null;        } finally {            if (session != null) {                session.release();            }        }    }    private <T> NebulaResult<T> query(Session session, String gql) throws IOErrorException {        String JSON = session.executejson(gql);        return JacksonUtil.extractByType(json, new TypeReference<>() {});    }}
辅助类 NebulaResult.java 等
外层结构

这里定义了 json 格式响应的外层结构

@Datapublic class NebulaResult<T> implements Serializable {    private List<Error> errors;    private List<Result<T>> results;    @JsonIgnore    public boolean isSuccess() {        return (errors != null && errors.size() == 1 && errors.get(0).getCode() == 0);    }    @Data    public static class Error implements Serializable {        private int code;    }    @Data    @JsonIgnoreProperties(ignoreUnknown = true)    @JsonInclude(JsonInclude.Include.NON_NULL)    public static class Result<T> implements Serializable {        private String spaceName;        private List<Element<T>> data;        private List<String> columns;        private Error errors;        private long latencyInUs;    }    @Data    public static class Element<T> implements Serializable {        private List<Meta<T>> meta;        private List<Serializable> row;    }    @Data    public static class Meta<T> implements Serializable {        private String type;        private T id;    }}

内层因为区分Edge和Vertex, 结构不一样. 如果是混合返回的结果, 可以用 Serializable

String gql = "match (v:ADDR)-[e]-() where id(v)==\"ADD:123123\" return v,e limit 100";        NebulaResult<Serializable> res = graphService.query("insurance", gql);        log.info(JacksonUtil.compress(res));        Assertions.assertThat(res).isNotNull();

对于边, 需要使用结构化的ID

@Data@JsonIgnoreProperties(ignoreUnknown = true)@JsonInclude(JsonInclude.Include.NON_NULL)public class EdgeId implements Serializable {    private int ranking;    private int type;    private String dst;    private String src;    private String name;}

用这个结构进行查询

NebulaResult<EdgeId> res3 = graphService.query("t_test1", "MATCH ()-[e:follow]-() RETURN e");

对于点, ID就是String

NebulaResult<String> res2 = graphService.query("t_test1", "MATCH (v:player) RETURN v");

感谢各位的阅读,以上就是“Nebula Graph和SpringBoot环境连接及查询如何实现”的内容了,经过本文的学习后,相信大家对Nebula Graph和SpringBoot环境连接及查询如何实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Nebula Graph和SpringBoot环境连接及查询如何实现

本文链接: https://www.lsjlt.com/news/358204.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Nebula Graph和SpringBoot环境连接及查询如何实现
    这篇文章主要讲解了“Nebula Graph和SpringBoot环境连接及查询如何实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Nebula Graph和Sprin...
    99+
    2023-07-06
  • Nebula Graph介绍和SpringBoot环境连接和查询操作
    目录说明GQL 常用查询基础配置和使用pom.xml 增加包依赖Java调用创建 NebulaPool 连接池创建 Session 会话执行查询在 SpringBoot 项目中使用 ...
    99+
    2022-11-13
    SpringBoot环境连接 Nebula Graph介绍
  • mysql如何实现多表连接查询
    这篇文章给大家分享的是有关mysql如何实现多表连接查询的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。实际的项目,存在多张表的关联关系。不可能在一张表里面就能检索出所有数据。如果...
    99+
    2024-04-02
  • SQL如何实现多表连接查询
    小编给大家分享一下SQL如何实现多表连接查询,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! 按连接方式分为等连接、非等连接、外连接、自连接、多表关联等1、等连...
    99+
    2024-04-02
  • SQL SERVER如何实现连接与合并查询
    这篇文章主要介绍了SQL SERVER如何实现连接与合并查询,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。创建测试表MyStudentInfoCREATE ...
    99+
    2023-06-29
  • 如何用SpringBoot框架实现切换启动开发环境和测试环境
    本篇内容介绍了“如何用SpringBoot框架实现切换启动开发环境和测试环境”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!SpringBoo...
    99+
    2023-06-21
  • Springboot如何使用logback实现多环境配置?
    前言 Logback是由log4j创始人设计的又一个开源日记组件,Logback 当前分成三个模块:logback-core,logback- classic和logback-ac...
    99+
    2024-04-02
  • SSH如何实现条件查询和分页查询
    这篇文章将为大家详细讲解有关SSH如何实现条件查询和分页查询,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、QueryHelper和PageResultQueryHel...
    99+
    2024-04-02
  • mysql数据库如何实现连表查询
    这篇文章将为大家详细讲解有关mysql数据库如何实现连表查询,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。  1.首先介绍表连接分类(内连接,外连接,交叉连接)和连接方法...
    99+
    2024-04-02
  • 如何实现SQL查询连续号码段
    这篇文章主要介绍“如何实现SQL查询连续号码段”,在日常操作中,相信很多人在如何实现SQL查询连续号码段问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何实现SQL查询连续号...
    99+
    2024-04-02
  • MySQL 普通查询、流式查询、游标查询以及使用 mybatis 如何实现
    MySQL 普通查询、流式查询、游标查询以及使用 mybatis 如何实现 MySQL 普通查询、流式查询、游标查询以及使用 mybatis 如何实现普通查询流式查询游标查询mybatis 如...
    99+
    2023-09-28
    mybatis java mysql
  • MySQL如何实现连表查询分组去重
    这篇文章主要介绍MySQL如何实现连表查询分组去重,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!业务逻辑通过多种渠道将小程序的活动页链接发布出去,比如通过多多种短信附带链接( channel 就记为 sms1,sms...
    99+
    2023-06-20
  • SpringBoot如何整合PageHelper实现分页查询功能
    这篇文章主要介绍了SpringBoot如何整合PageHelper实现分页查询功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。使用方法导入依赖在中央仓库sonatype中搜...
    99+
    2023-06-29
  • 如何在MySQL中进行跨表查询和连接操作
    在MySQL中进行跨表查询和连接操作通常使用JOIN语句来实现。以下是一些常用的跨表查询和连接操作方式: 内连接(INNER JO...
    99+
    2024-04-09
    MySQL
  • BootStrapz2select2如何实现查询以及输入功能
    小编给大家分享一下BootStrapz2select2如何实现查询以及输入功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!首先...
    99+
    2024-04-02
  • 如何实现bat/cmd批处理连接SqlServer数据库查询脚本
    这篇文章主要介绍“如何实现bat/cmd批处理连接SqlServer数据库查询脚本”,在日常操作中,相信很多人在如何实现bat/cmd批处理连接SqlServer数据库查询脚本问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希...
    99+
    2023-06-08
  • C#如何连接SQL数据库和查询数据功能
    这篇文章将为大家详细讲解有关C#如何连接SQL数据库和查询数据功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。大数据时代在编程可能需要用到一些文本内容,不可能全部写到代码里,不好更改,用户也不方便使用所...
    99+
    2023-06-15
  • 如何使用SpringBoot+MyBatisPlus+MySQL8实现树形结构查询
    这篇文章主要为大家展示了“如何使用SpringBoot+MyBatisPlus+MySQL8实现树形结构查询”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用SpringBoot+MyBat...
    99+
    2023-06-15
  • springboot jpa如何实现返回结果自定义查询
    这篇文章主要讲解了“springboot jpa如何实现返回结果自定义查询”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“springboot jpa如何实现返回结果自定义...
    99+
    2023-06-29
  • ajax如何实现分页和分页查询
    这篇文章将为大家详细讲解有关ajax如何实现分页和分页查询,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先为了页面的整齐与美观,我用到了bootstrap,需要引进所需要的文件包<link&nbs...
    99+
    2023-06-08
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作