Skip to content

Neo4j Cypher Shell 命令

Cypher Shell 工作流程

Cypher Shell 的工作流程可以分为以下几个主要步骤:

安装和启动

安装

Cypher Shell 随 Neo4j 服务器一起安装,位于 $NEO4J_HOME/bin/ 目录下。

启动方式

交互式模式

bash
# 基本启动方式
cypher-shell -u <username> -p <password> -d <database>

# 使用默认配置(用户名:neo4j,数据库:neo4j)
cypher-shell

# 从环境变量获取密码
export NEO4J_PASSWORD=<password>
cypher-shell -u <username>

非交互式模式

bash
# 执行单个查询
cypher-shell -u <username> -p <password> -d <database> "MATCH (n) RETURN count(n);"

# 执行文件中的查询
cypher-shell -u <username> -p <password> -d <database> -f queries.cypher

# 从标准输入读取查询
echo "MATCH (n) RETURN count(n);" | cypher-shell -u <username> -p <password>

连接选项

基本连接参数

选项描述默认值
-u, --username数据库用户名neo4j
-p, --password数据库密码无(交互式提示)
-d, --database目标数据库名称neo4j
-a, --address数据库地址bolt://localhost:7687
--encryption是否使用加密连接true

高级连接参数

选项描述
--format输出格式(plain, verbose, csv, json)
--debug启用调试模式
--non-interactive非交互式模式
--fail-fast遇到错误时立即退出
--param设置查询参数

交互式命令

会话命令

:help

显示帮助信息:

:help
:help <command>

:exit:quit

退出 Cypher Shell:

:exit
:quit

:clear

清屏:

:clear

:history

查看命令历史:

:history

:param

设置或查看查询参数:

:param name => 'Alice'
:param age => 30
:param params => {name: 'Alice', age: 30}
:param  # 查看所有参数

:params

查看所有参数:

:params

数据库命令

:use

切换数据库:

:use <database-name>

:schema

查看数据库 schema:

:schema

:indexes

查看所有索引:

:indexes

:constraints

查看所有约束:

:constraints

事务命令

:begin

开始事务:

:begin

:commit

提交事务:

:commit

:rollback

回滚事务:

:rollback

输出格式命令

:format

设置输出格式:

:format plain
:format verbose
:format csv
:format json

:style

设置输出样式:

:style ASCII
:style Unicode

常用命令示例

数据库操作

cypher
# 查看数据库版本
CALL dbms.components() YIELD name, version RETURN name, version;

# 查看数据库状态
CALL dbms.health.check();

# 查看数据库列表
SHOW DATABASES;

# 创建数据库
CREATE DATABASE <database-name>;

# 删除数据库
DROP DATABASE <database-name>;

用户和权限管理

cypher
# 创建用户
CREATE USER <username> SET PASSWORD '<password>' CHANGE NOT REQUIRED;

# 删除用户
DROP USER <username>;

# 修改用户密码
ALTER USER <username> SET PASSWORD '<new-password>';

# 创建角色
CREATE ROLE <role-name>;

# 授予角色权限
GRANT ROLE <role-name> TO <username>;

# 授予权限
GRANT MATCH {*} ON GRAPH * TO <role-name>;

数据导入导出

cypher
# 导出数据到 CSV
MATCH (n:Person) RETURN n.name, n.age, n.city ORDER BY n.name
INTO CSV "file:///persons.csv";

# 从 CSV 导入数据
LOAD CSV WITH HEADERS FROM "file:///persons.csv" AS row
CREATE (n:Person {name: row.name, age: toInteger(row.age), city: row.city});

输出格式

Plain 格式

默认输出格式,适合人类阅读:

cypher-shell --format plain "MATCH (n:Person) RETURN n.name, n.age LIMIT 3;"

输出示例:

n.name  | age
--------+------
Alice   | 30
Bob     | 35
Charlie | 40

执行时间:3 rows available after 2 ms, consumed after another 0 ms

CSV 格式

适合数据导出和处理:

cypher-shell --format csv "MATCH (n:Person) RETURN n.name, n.age LIMIT 3;"

n.name,age
Alice,30
Bob,35
Charlie,40

JSON 格式

适合程序处理:

cypher-shell --format json "MATCH (n:Person) RETURN n.name, n.age LIMIT 2;"

{"results":[{"columns":["n.name","n.age"],"data":[{"row":["Alice",30]},{"row":["Bob",35]}]}],"errors":[]}

Verbose 格式

显示详细的查询信息:

cypher-shell --format verbose "MATCH (n:Person) RETURN n.name, n.age LIMIT 2;"

输出示例:

Updated 0 nodes, created 0 relationships, set 0 properties, deleted 0 nodes, deleted 0 relationships
statement: MATCH (n:Person) RETURN n.name, n.age LIMIT 2;
n.name  | age
--------+------
Alice   | 30
Bob     | 35

执行时间:2 rows available after 2 ms, consumed after another 0 ms

最佳实践

1. 使用参数化查询

bash
# 推荐
cypher-shell --param name="Alice" "MATCH (n:Person {name: $name}) RETURN n;"

# 不推荐
cypher-shell "MATCH (n:Person {name: 'Alice'}) RETURN n;"

2. 批量执行查询

bash
# 创建包含多个查询的文件
echo -e "MATCH (n:Person) RETURN count(n);
MATCH (r:Relationship) RETURN count(r);" > count-queries.cypher

# 执行文件中的所有查询
cypher-shell -f count-queries.cypher

3. 使用非交互式模式自动化任务

bash
# 在脚本中使用
#!/bin/bash

# 设置变量
USERNAME="neo4j"
PASSWORD="password"
DATABASE="neo4j"

# 执行查询并捕获输出
NODE_COUNT=$(cypher-shell -u $USERNAME -p $PASSWORD -d $DATABASE --format plain "MATCH (n) RETURN count(n);" | grep -A1 "count(n)" | tail -n1 | tr -d ' ')

# 使用结果
echo "数据库中有 $NODE_COUNT 个节点"

4. 启用加密连接

bash
# 明确指定加密连接
cypher-shell --encryption true -a bolt://localhost:7687

5. 限制结果集大小

bash
# 避免返回过多结果
cypher-shell "MATCH (n) RETURN n LIMIT 100;"

配置文件

Cypher Shell 支持使用配置文件保存连接参数,默认配置文件位于 ~/.config/cypher-shell/config

配置文件格式

ini
# 基本配置
username = neo4j
password = password
database = neo4j
address = bolt://localhost:7687
encryption = true

# 高级配置
format = plain

使用自定义配置文件

bash
cypher-shell --config /path/to/custom/config

常见问题及解决方案

问题 1:连接失败

可能原因

  • 数据库地址或端口不正确
  • 用户名或密码错误
  • 数据库未启动
  • 防火墙阻止连接

解决方案

  • 检查数据库地址和端口
  • 验证用户名和密码
  • 确认数据库已启动
  • 检查防火墙设置

问题 2:查询执行缓慢

可能原因

  • 查询复杂度高
  • 缺少适当的索引
  • 数据库负载高
  • 结果集过大

解决方案

  • 优化查询逻辑
  • 添加适当的索引
  • 检查数据库性能
  • 限制结果集大小

问题 3:输出格式不符合预期

解决方案

  • 使用 --format 选项指定输出格式
  • 在交互式模式下使用 :format 命令
  • 检查配置文件中的默认格式设置

与其他工具的集成

与脚本集成

bash
#!/bin/bash

# 定期执行备份检查
BACKUP_COUNT=$(cypher-shell "CALL dbms.listQueries() YIELD query WHERE query CONTAINS 'backup' RETURN count(query);" | grep -A1 "count(query)" | tail -n1 | tr -d ' ')

if [ $BACKUP_COUNT -eq 0 ]; then
  echo "警告:最近没有备份任务执行"
  # 发送告警通知
fi

与监控工具集成

bash
# 收集数据库指标
#!/bin/bash

METRICS_FILE="/tmp/neo4j-metrics.csv"

# 收集指标
echo "timestamp,node_count,relationship_count" > $METRICS_FILE

while true; do
  TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S")
  NODE_COUNT=$(cypher-shell "MATCH (n) RETURN count(n);" | grep -A1 "count(n)" | tail -n1 | tr -d ' ')
  RELATIONSHIP_COUNT=$(cypher-shell "MATCH ()-[r]->() RETURN count(r);" | grep -A1 "count(r)" | tail -n1 | tr -d ' ')
  echo "$TIMESTAMP,$NODE_COUNT,$RELATIONSHIP_COUNT" >> $METRICS_FILE
  sleep 60
done

常见问题(FAQ)

Q1: 如何在 Cypher Shell 中执行多行查询?

A1: 在交互式模式下,使用换行符分隔多行查询,系统会自动识别查询结束。在非交互式模式下,可以使用分号分隔多个查询,或使用 -f 选项执行文件中的多行查询。

Q2: 如何保存查询结果到文件?

A2: 使用重定向操作符 >>>

bash
cypher-shell "MATCH (n:Person) RETURN n.name, n.age;" > persons.csv

Q3: 如何处理包含特殊字符的密码?

A3: 使用引号包裹密码,或从环境变量获取密码:

bash
# 使用引号
cypher-shell -p "password-with-$pecial-chars"

# 从环境变量
export NEO4J_PASSWORD="password-with-$pecial-chars"
cypher-shell

Q4: 如何在 Cypher Shell 中使用事务?

A4: 使用 :begin:commit:rollback 命令:

:begin
MATCH (n:Person {name: 'Alice'}) SET n.age = n.age + 1;
MATCH (n:Person {name: 'Bob'}) SET n.age = n.age + 1;
:commit

Q5: 如何查看 Cypher Shell 的版本?

A5: 使用 --version 选项:

bash
cypher-shell --version