外观
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,40JSON 格式
适合程序处理:
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.cypher3. 使用非交互式模式自动化任务
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:76875. 限制结果集大小
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.csvQ3: 如何处理包含特殊字符的密码?
A3: 使用引号包裹密码,或从环境变量获取密码:
bash
# 使用引号
cypher-shell -p "password-with-$pecial-chars"
# 从环境变量
export NEO4J_PASSWORD="password-with-$pecial-chars"
cypher-shellQ4: 如何在 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;
:commitQ5: 如何查看 Cypher Shell 的版本?
A5: 使用 --version 选项:
bash
cypher-shell --version