GDB Cypher:Cypher用户的最佳选择

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: Neo4J是DB-Engines图数据领域长期排名第一的数据库产品,目前有社区版和企业版两个版本

Neo4J 是DB-Engines图数据领域长期排名第一的数据库产品,目前有社区版和企业版两个版本:

• 社区版:单实例、无容灾、不支持热备、缺乏技术支撑
• 企业版:高性能、可扩展、高可用、多种安全级别、数据完整性、完全托管、丰富的监控&审计

企业版目前最便宜的4Core单实例一年价格将近30万,高昂的价格让国内中小企业望而却步。目前国内大部分用户都选择社区版并在上面做定制开发,这需要企业投入额外人力成本进行图数据自管理和运营。下面是Neo4j企业版和Gdb云产品不同规格的价格对比:
1.png

兼容性

既然想要接入Gdb,那么Gdb目前Cypher支持到什么程度了?是否可以满足业务的使用需求?
目前Gdb Cypher只支持bolt-v3协议;数据类型上目前支持Temporal外所有的数据类型,子句上基本支持所有常用的子句,函数上除过一些算数方法外基本也支持所有常用的函数,Procedure目前只支持少量的场景;Gdb相比Neo4j 4.0的差异主要提现在多图、索引、导入导出、可视化等方面;Sessions目前支持常见的同步异步两种模式。

数据类型

2.png

子句/函数

3.png

Neo4j差异性

4.png

接入方式

业务觉得目前支持的Cypher场景已经足够接入,那么想接入Gdb,该怎么接入呢?

数据导入

假定数据可以在Neo4j社区版中,首先利用apoc导出为graphml格式,其次利用GraphML2CSV转为CSV格式,然后将CSV文件上传到OSS中,最后通过Gdb命令将OSS文件导入到Gdb中。
5.png

存量数据已经导入到Gdb中了,怎么插入新的数据?怎么查询存储数据?这里就需要通过客户端Driver来接入了。
官方4.0版本目前提供包括 Java, .Net, JavaScript三种接入形式,另外Go, Python正在开发中。 Gdb目前主要支持Java、 .Net两个版本。以Java Driver为例,目前按业务需求可以支持两种接入形态:

Java Driver

• 依赖

<dependency>
    <groupId>org.neo4j.driver</groupId>
    <artifactId>neo4j-java-driver</artifactId>
    <version>4.0.0</version>
</dependency>

• 初始化

public Demo() {
    String uri = "bolt://server-domain:server-port";
    String username = "your-gdb-username";
    String password = "your-gdb-password"
    Logging logging = new ConsoleLogging(FINE);
    Config config = Config.builder()
        .withLogging(logging)
        .withMaxConnectionLifetime(30, TimeUnit.MINUTES)
        .withMaxConnectionPoolSize(50)
        .withConnectionAcquisitionTimeout(2, TimeUnit.MINUTES)
        .build();
    private  Driver driver = GraphDatabase.driver(uri, 
         AuthTokens.basic(username, password), config);
}

• Simple Sessions

public void simpleSessions(final String dsl, final Map<String, Object> args) {
    try (Session session = driver.session()) {
        ///1. Transaction functions
        session.writeTransaction(tx -> {
            StringBuilder buffer = new StringBuilder();
            Result result = tx.run(dsl, args);
            result.stream().forEach(t -> 
                System.out.println(output(t)));
            return buffer.toString();
        });
        ///2. Auto-commit Transactions tested
        {
            Result result = session.run(dsl, args);
            result.stream().forEach(t -> 
                System.out.println(output(t)));
        }
    }
}

• Async Sessions

public void asyncSample(final String dsl, final Map<String, Object> args) {
    AsyncSession session = driver.asyncSession();
    ///1.  Transaction functions
    session.readTransactionAsync(tx ->
        tx.runAsync(dsl, args)
            .thenCompose(cursor -> cursor.forEachAsync(record ->
                System.out.println("asyncTransactionFuctions - " + record.get(0))))
    );
    ///2. Auto-commit Transactions tested
    session.runAsync(dsl, args)
        .thenCompose(cursor -> cursor.forEachAsync(record ->
            System.out.println("asyncAutoTransactions - " + record.get(0))));
}
Spring Data Neo4j
• 依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>

• 配置环境
修改src/main/resources/application.properties文件,配置域名、用户名、密码

• 测试
这里提供了一个Movie-Actor的Sample可以作为学习教程
恭喜您!到了这里,您已经可以顺利将Cypher数据导入Gdb,并根据业务具体场景进行简单的添加、查询、更新、删除了。可能使用中会碰到一些小的困惑,下面的Tips或许可以提供一些帮助:

最佳实践

• 参数化
用户请求基本上一般只有几种场景,参数化把每种类型的翻译结果进行缓存,从而加速语句的执行时解析,比如

• Parameters:
{
  "name" : "Michael"
}

• Query:

MATCH (n:Person)
WHERE n.name STARTS WITH $name
RETURN n.name

• 设置线程池的大小
在初始化Neo4j的Driver时,需要配置MaxConnectionPoolSize、ConnectionTimeout、MaxConnectionLifetime等参数,这样能充分利用线程池、并且控制连接的生命周期,更多的配置参考这里

• 删除时限制大小
由于Gdb对事务Buffer的大小限制为64M,如果一次删除的数据量过大可能导致事务无法成功,建议通过LIMIT限制数据集

MATCH (n) LIMIT 1024 DETACH DELETE n;

• 关于Bolt协议
目前Neo4j 4.0最新的Bolt协议为V4,Gdb Server目前提供的最低版本为Bolt V3,建议Java driver使用版本为:4.0.0或者2.0.0-alpha01。

参考

1. Neo4j企业版能力
2. Neo4j企业版价格
3, Neo4j Cypher Manual 4.0
4. Neo4j Driver列表

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
7月前
|
SQL 关系型数据库 MySQL
MySQL数据库——索引(4)-SQL性能分析-profile详情、explain(profile查看指令,explain执行计划中各个字段的含义)
MySQL数据库——索引(4)-SQL性能分析-profile详情、explain(profile查看指令,explain执行计划中各个字段的含义)
88 2
|
8月前
|
NoSQL
neo4j的Cypher的语法记录
neo4j的Cypher的语法记录
|
关系型数据库 MySQL 数据管理
MySQL查询语言:从SELECT到多表查询
本文深入探讨了MySQL查询语言的核心要素,涵盖了SELECT语句的详解、WHERE子句与逻辑操作符、ORDER BY子句与排序、聚合函数与GROUP BY子句,以及JOIN操作与多表查询。通过详细介绍每个部分的用法和示例,读者可以轻松掌握在MySQL中进行数据查询和分析的关键技能。了解SELECT语句的构造,以及如何使用WHERE子句和逻辑操作符筛选数据,能够使读者更有效地提取所需信息。此外,通过掌握ORDER BY子句进行排序和使用聚合函数进行数据汇总,读者将能够在查询结果中获得更有价值的信息。最后,本文还介绍了JOIN操作,使读者能够从多个数据表中联合数据,实现更复杂的查询需求
99 0
|
8月前
|
SQL 关系型数据库 HIVE
Hive中的HQL是什么?请解释其语法和常用操作。
Hive中的HQL是什么?请解释其语法和常用操作。
95 0
|
8月前
|
SQL 关系型数据库 MySQL
SQL-JOIN全解析
SQL-JOIN全解析
129 0
|
SQL Oracle 关系型数据库
【SQL开发实战技巧】系列(四):从执行计划讨论UNION ALL与空字符串&UNION与OR的使用注意事项
本篇文章讲解的主要内容是:***有重复数据的数据集用UNION后得到的数据与预期不一致如何解决,当两个表中有重复数据时,UNION的去重功能被忽略,UNION过程中如何识别展示出来、空值与空字符串的关系以及在UNION ALL中的使用、UNION与OR可以互相改写以及使用中的注意事项。***
【SQL开发实战技巧】系列(四):从执行计划讨论UNION ALL与空字符串&UNION与OR的使用注意事项
SQL语句中union all和union的区别以及用法
SQL语句中union all和union的区别以及用法
175 0
|
SQL 机器学习/深度学习 存储
最新最全的Explain使用手册
最新最全的Explain使用手册
216 0
最新最全的Explain使用手册
|
SQL Oracle 关系型数据库
在plsql , sql语句中带有中文的查询条件查询不到数据
在plsql , sql语句中带有中文的查询条件查询不到数据
535 0
在plsql , sql语句中带有中文的查询条件查询不到数据
|
SQL 数据可视化 JavaScript
SQL语言基础操作与语法
1.SQL简介 SQL是用于访问和处理数据库的标准计算机语言. SQL是Structured Query Language的缩写,是结构化查询语言 简单易学 功能强大 只需要说明做什么,不需要说明如何做 标准化。SQL语言几乎所有的DBMS(关系数据库)都能通用 不区分大小写