如何使用 cypher-shell neo4j 命令从终端 运行 密码脚本文件?

How to run a cypher script file from Terminal with the cypher-shell neo4j command?

我有一个密码脚本文件,我想直接运行它。

据我所知,我可以在 SO 上找到的所有答案都使用命令 neo4j-shell,在我的版本(Neo4j 服务器 3.5.5)中似乎已弃用并替换为命令 cyphershell.

使用命令 sudo ./neo4j-community-3.5.5/bin/cypher-shell --help 我得到了以下说明。

usage: cypher-shell [-h] [-a ADDRESS] [-u USERNAME] [-p PASSWORD] [--encryption {true,false}] [--format {auto,verbose,plain}] [--debug] [--non-interactive] [--sample-rows SAMPLE-ROWS] [--wrap {true,false}] [-v] [--driver-version] [--fail-fast | --fail-at-end] [cypher]

A command line shell where you can execute Cypher against an instance of Neo4j. By default the shell is interactive but you can use it for scripting by passing cypher directly on the command line or by piping a file with cypher statements (requires Powershell on Windows).

我的文件如下,它试图从 csv 文件创建图表,它来自 "Graph Algorithms".

一书
WITH "https://github.com/neo4j-graph-analytics/book/raw/master/data" AS base 
WITH base + "transport-nodes.csv" AS uri
LOAD CSV WITH HEADERS FROM uri AS row
MERGE (place:Place {id:row.id})
SET place.latitude = toFloat(row.latitude),
  place.longitude = toFloat(row.latitude),
  place.population = toInteger(row.population)

WITH "https://github.com/neo4j-graph-analytics/book/raw/master/data/" AS base 
WITH base + "transport-relationships.csv" AS uri
LOAD CSV WITH HEADERS FROM uri AS row
MATCH (origin:Place {id: row.src})
MATCH (destination:Place {id: row.dst})
MERGE (origin)-[:EROAD {distance: toInteger(row.cost)}]->(destination)

当我尝试使用命令直接传递文件时:

sudo ./neo4j-community-3.5.5/bin/cypher-shell neo_4.cypher

首先它要求输入用户名和密码,但在输入正确的密码后(错误的密码导致错误 The client is unauthorized due to authentication failure.)我得到错误:

Invalid input 'n': expected <init> (line 1, column 1 (offset: 0))
"neo_4.cypher"
 ^

当我尝试使用以下命令管道时:

 sudo cat neo_4.cypher| sudo ./neo4j-community-3.5.5/bin/cypher-shell -u usr -p 'pwd'

没有生成输出,也没有图表。

如何使用 neo4j 命令 运行 加密脚本文件 cypher-shell?

我觉得关键在这里:

cypher-shell -- help

... Stuff deleted

positional arguments:
  cypher                 an optional string of cypher to execute and then exit

这意味着参数是实际的密码,而不是文件名。因此,这有效:

GMc@linux-ihon:~> cypher-shell "match(n) return n;"
username: neo4j
password: ****
+-----------------------------+
| n                           |
+-----------------------------+
| (:Job {jobName: "Job01"})   |
| (:Job {jobName: "Job02"})   |

但这不是(因为文本 "neo_4.cypher" 不是有效的密码查询)

cypher-shell neo_4.cypher

帮助也说:

example of piping a file:
  cat some-cypher.txt | cypher-shell

所以:

cat neo_4.cypher | cypher-shell

应该可以。可能您的问题是所有 sudo 的问题。特别是猫... |须藤 cypher-shell。 sudo 可能正在保护 cypher-shell 不受某些任意输入的影响(尽管它在我的系统上似乎没有这样做)。

如果你真的需要使用 sudo 来 运行 密码,请尝试使用以下命令:

sudo cypher-shell arguments_as_needed < neo_4.cypher

哦,另外,您的脚本没有 return,因此它可能不会显示任何数据,但您应该仍会看到已加载记录的摘要报告。

也许先尝试一些更简单的方法,例如简单的匹配……return……在您的脚本中查询。

哦,别忘了用 semi-colon!

终止密码查询

问题出在密码文件中:每行应以分号结尾:;。我仍然需要 sudo 到 运行 程序。

从书中摘取的文件实际上似乎也包含其他错误。

使用cypher-shell -f yourscriptname。查看 --help 了解更多说明。