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
目录
相关文章
|
6月前
|
关系型数据库 数据库连接 数据库
Python执行PG数据库查询语句:以Markdown格式打印查询结果
使用Python的`psycopg2`和`pandas`库与PostgreSQL交互,执行查询并以Markdown格式打印结果。首先确保安装所需库:`pip install psycopg2 pandas`。接着建立数据库连接,执行查询,将查询结果转换为DataFrame,再用`tabulate`库将DataFrame格式化为Markdown。代码示例包括连接函数、查询函数、转换和打印函数。最后限制列宽以适应输出。
|
7月前
|
NoSQL
neo4j的Cypher的语法记录
neo4j的Cypher的语法记录
|
存储 自然语言处理 NoSQL
Text2Cypher:大语言模型驱动的图查询生成
本文的主题是我们认为这个 LLM+ 领域最唾手可得、最容易摘取的果实,Text2Cypher:自然语言生成图查询。输入自然语言,生成相对应的图查询语句,甚至可以直接返回该语句执行结果。
438 0
|
SQL XML 关系型数据库
PostgreSQL 12 文档: 部分 VIII. 附录
部分 VIII. 附录 目录
95 0
|
SQL Oracle 关系型数据库
Python编程:records库操作SQL查询MySQL数据库
Python编程:records库操作SQL查询MySQL数据库
177 0
|
SQL OLAP Python
Jupyter(Python)模糊查询Analytic DB数据的正确方法
Jupyter(Python)模糊查询Analytic DB数据的正确方法
2536 0
|
分布式计算 DataWorks NoSQL
图数据库GDB数据导入简介的方法有几种?
GDB支持从各种数据源导入数据,针对不同的数据格式和环境,提供以下三种导入服务,您可以结合自己的开发测试环境选择适合的方式导入数据。
1580 0
|
SQL 关系型数据库 数据库
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 9 章 函数和操作符_9.25. 系统信息函数
9.25. 系统信息函数 表 9.60展示了多个可以抽取会话和系统信息的函数。 除了本节列出的函数,还有一些与统计系统相关的函数也提供系统信息。详见第 28.2.2 节。 表 9.60.
1400 0
|
SQL 监控 关系型数据库
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 9 章 函数和操作符_9.26. 系统管理函数
9.26. 系统管理函数 9.26.1. 配置设定函数 9.26.2. 服务器信号函数 9.26.3. 备份控制函数 9.26.4. 恢复控制函数 9.26.5. 快照同步函数 9.26.6. Replication Functions 9.26.7. 数据库对象管理函数 9.26.8. 索引维护函数 9.26.9. 通用文件访问函数 9.26.10. 咨询锁函数 这一节描述的函数被用来控制和监视一个PostgreSQL安装。
1699 0
|
SQL 自然语言处理 关系型数据库
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 12 章 全文搜索_12.8. 测试和调试文本搜索
12.8. 测试和调试文本搜索 12.8.1. 配置测试 12.8.2. 解析器测试 12.8.3. 词典测试 一个自定义文本搜索配置的行为很容易变得混乱。本节中描述的函数对于测试文本搜索对象有用。
1188 0