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

时间:2019-05-08 10:30:12

标签: csv neo4j terminal cypher cypher-shell

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

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

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

  

用法:密码壳[-h] [-a地址] [-u用户名] [-p密码]   [-加密{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   Neo4j的实例。默认情况下,外壳是交互式的,但是您可以   通过直接在命令上传递cypher将其用于脚本   行或使用cypher语句通过管道传递文件(需要Powershell   在Windows上)。

以下是我的文件,它试图从csv文件创建图形,它来自《图形算法》一书。

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运行密码脚本文件?

3 个答案:

答案 0 :(得分:3)

使用cypher-shell -f yourscriptname。请与--help联系以获取更多说明。

答案 1 :(得分:1)

我认为关键在这里:

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的问题。特别是猫... | sudo cyshell。 sudo可能会保护cypher-shell免受某些任意输入的影响(尽管在我的系统上似乎没有这样做)。

如果您确实需要使用sudo来运行cypher,请尝试使用以下命令:

sudo cypher-shell arguments_as_needed < neo_4.cypher

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

也许首先尝试一些更简单的操作,例如简单匹配... return ...在脚本中查询。

哦,别忘了用分号终止密码查询!

答案 2 :(得分:0)

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

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