如何在终端上使用cypher-shell neo4j命令运行Cypher脚本文件?

10
我有一个Cypher脚本文件,我想直接运行它。根据我所知,在SO上找到的所有答案都使用命令neo4j-shell,但在我的版本(Neo4j server 3.5.5)中似乎被弃用并替换为命令cyphershell。通过使用命令sudo ./neo4j-community-3.5.5/bin/cypher-shell --help,我获得了以下说明。这是一个命令行shell,您可以针对Neo4j实例执行Cypher。默认情况下,shell是交互式的,但是您可以通过直接在命令行上传递Cypher或通过管道传递带有Cypher语句的文件(在Windows上需要PowerShell)来将其用于脚本。我的文件尝试从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脚本文件?

3个回答

11

使用 cypher-shell -f yourscriptname 命令来运行你的脚本。查看更多说明请使用 --help 参数。


5

我认为这里的关键是:

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查询)。
cypher-shell neo_4.cypher

这里还有些帮助信息:
example of piping a file:
  cat some-cypher.txt | cypher-shell


所以:
cat neo_4.cypher | cypher-shell

应该可以工作。可能你的问题都是sudo导致的。特别是cat ... | sudo cypher-shell这一行。有可能sudo正在保护cypher-shell免受任意输入(尽管在我的系统上似乎不需要)。

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

sudo cypher-shell arguments_as_needed < neo_4.cypher

另外,你的脚本没有返回值,所以它可能不会显示任何数据,但你仍然应该能看到记录加载的摘要报告。

也许先尝试一些简单的匹配...返回...在你的脚本中查询。

哦,别忘了用分号结束Cypher查询!


感谢您的回复。我尝试了一个更简单的命令并得到了结果。显然,即使是像 sudo ./neo4j-community-3.5.5/bin/cypher-shell "MATCH (n:Person) RETURN n LIMIT 25;" 这样的简单命令,我也需要使用 sudo ,否则将没有输出生成。此外,您提供的例子 sudo cypher-shell arguments_as_needed < neo_4.cypher 没有输出任何内容。 - roschach
我在想这是不是个bug?我的系统出现了同样的问题。这里有一个相似的bug报告 here。虽然不完全相同(我的文件没有BOM字符),但还是相似的。我会继续尝试研究,看看能否找到更多线索。 - GMc
感谢您的帮助。问题在于,对于密码术,每行都必须以“;”结尾。我仍然需要sudo,但这不是问题。 - roschach
经过一晚上的思考,我意识到我又一次在文本文件中的查询语句中忘记了添加分号。添加后,它按预期工作。我会将其添加到答案中 :-) - GMc
@Francesco_Boi 如果这些答案中的任何一个对您有帮助,请您选择其中一个作为答案并“点赞”。只需单击您认为最有帮助的答案旁边的小灰色“勾号”即可。 - GMc
当你发布时,我已经为你点赞了:实际上它有一个+1的分数(由我投票)。但是,我的答案中解释了有效的方法。 - roschach

3
问题出在密码文件中:每行都应该以分号;结尾。我仍然需要使用sudo来运行程序。从书中获取的文件似乎还包含其他错误。最初的回答。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接