【问题标题】:How to run a cypher script file from Terminal with the cypher-shell neo4j command?如何使用 cypher-shell neo4j 命令从终端运行密码脚本文件?
【发布时间】:2019-05-08 10:30:11
【问题描述】:

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

据我所知,我可以在 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] [密码]

一个命令行 shell,您可以在其中执行 Cypher Neo4j 的实例。默认情况下,shell 是交互式的,但您可以 通过直接在命令上传递密码来使用它来编写脚本 行或通过管道传输带有密码语句的文件(需要 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 运行密码脚本文件?

【问题讨论】:

    标签: csv neo4j terminal cypher cypher-shell


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我认为关键在这里:

      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 可能正在保护 cypher-shell 免受某些任意输入的影响(尽管在我的系统上似乎没有这样做)。

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

      sudo cypher-shell arguments_as_needed < neo_4.cypher
      

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

      或许可以先尝试一些更简单的方法,例如在您的脚本中进行简单的匹配...返回...查询。

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

      【讨论】:

      • 感谢您的回复。我尝试了一个更简单的命令并得到了结果。显然我需要sudo,即使是对于sudo ./neo4j-community-3.5.5/bin/cypher-shell "MATCH (n:Person) RETURN n LIMIT 25;" 这样的简单命令,否则不会生成任何输出。您的示例 sudo cypher-shell arguments_as_needed &lt; neo_4.cypher 也没有输出任何内容。
      • 不知道有没有bug?我的系统做同样的事情。有这个类似的错误报告here。这不是完全相同的问题(我的文件没有 BOM 字符),但它是相似的。我会继续玩它,看看我是否能找到更多。
      • 感谢您的帮助。问题在于,对于 cypher,每一行都必须以 ; 结尾。我仍然需要sudo,但这不是问题。
      • 睡在上面之后,我意识到我(再次)忘记了文本文件中查询的尾随分号。添加后,它按预期工作。我会把它添加到答案中:-)
      • @Francesco_Boi 如果这些答案中的任何一个对您有所帮助,请您接受其中一个作为答案并“投赞成票”。只需点击您认为对您最有帮助的答案旁边的灰色小“复选标记”即可。
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2017-01-15
        • 2016-04-18
        • 1970-01-01
        • 1970-01-01
        • 2018-05-04
        • 1970-01-01
        • 2021-10-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多