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