【问题标题】:Why is the Neo4j Bolt Driver inconsistent between shell and IDE?为什么Neo4j Bolt Driver 在shell 和IDE 之间不一致?
【发布时间】:2018-04-14 20:31:56
【问题描述】:

我发现neo4j-bolt-driver 有一个奇怪的行为。当我使用Pycharm 运行我的代码时,它运行得非常好,对于neo4j 的单个查询,我得到以下响应:

type: neo4j.node    # I pulled out the type of the element.
<Node id=3820 labels={'city'} properties={'ID': 'xddy', 'name': 'california'}>

现在,当我打包我的代码并从中创建一个.egg,然后使用终端运行脚本以将相同的输入输入到同一个数据库时,我得到以下响应:

type: neo4j.node    # I pulled out the type of the element.
(_3820:city {ID: 'xddy', name: 'california'})

现在看看响应的差异,类型相同,只是缺少对象的keys

这导致AttributeError。更糟糕的是我必须手动将数据解析成一个字典,以便我可以处理它。


副作用:

try:
    props = node[admin].properties
    node_chain[list(node[admin].labels)[0]] = props
    address.append(props['name'])
except AttributeError:

    # try to convert (_3820:city {ID: 'xddy', name: 'california'})
    # to {'ID': 'xddy', 'name': 'california'}
    # and add it to an existing dict with the key `city`

    string_rep = str(node[admin])
    splitted = string_rep.split('{')
    label = splitted[0].split(':')[-1].strip()
    payload_string = "{ " + splitted[1][:-1]
    clean = payload_string.replace("'", " ").replace(":", "':'").replace(",", "','")\
        .replace("{", "{'").replace("}", "'}")
    temp_dict = ast.literal_eval(clean)
    payload_dict = {k.strip(): v.strip() for k, v in temp_dict.items()}
    address.append(payload_dict['name'])
    node_chain[label] = payload_dict

我正在寻找两个答案:

  • 螺栓驱动器有问题还是只是我从egg 运行时的代码
  • 有没有更好的方法将无效内容解析为字典?

【问题讨论】:

  • 你在 PyCharm 和你的 shell 之间运行在同一个环境中吗?我怀疑这里发生的事情是它们不是同一个环境,并且每个环境都有不同版本的neo4j-driver 模块。您是否为此使用虚拟环境?在 PyCharm 中,在 Preferences -> Project -> Project Interpreter 下,解释器是否设置为与在 shell 中执行时返回的 whereis python(或 python2python3,如果您使用的是)相同的可执行路径?或者,如果您使用 virtualenv,PyCharm 项目解释器是否设置为那个?
  • @RebeccaNelson 他们都使用相同的虚拟环境。等待他们在几个版本中更改了来自Bolt 查询的响应?如果是这样,哪一个是最新的(希望是具有适当标签和属性的那个)?
  • 嗯...嗯,我很难过。那么它们应该是相同的版本......好吧,我意识到我要求你“证明”你在说什么,我很抱歉,但为了完整起见,项目解释器设置的路径是什么,以及用于激活 virtualenv 并从 shell 执行的确切命令是什么?
  • @RebeccaNelson in Pycharm 解释器路径是 X:\Projects\Python\HybridCart\venv\Scripts\Python 而在终端上运行它时我 cd X:\Projects\Python\HybridCart\venv\Scripts` and then type in activate` 然后输入 python 以启动 console 然后只需执行导入语句,然后执行 process_order() 函数调用。
  • neo4j-driver 的 API 最近确实发生了变化。实际上,我有一个项目的新部署,其中neo4j-driver 没有固定到特定版本,并且在更新模块时它完全破坏了我的应用程序;如果我记得的话,甚至在两个次要版本号之间。作为参考,这是大约 2 周前,我最初设置的版本大约是 2 个月前。

标签: python-3.x neo4j neo4j-driver


【解决方案1】:

您的执行环境存在差异。

即使您使用相同的虚拟环境来执行 shell 和 PyCharm 项目解释器,但在执行 .egg 时,可能会修改执行环境以获取所有库的新副本,这些库不一定安装到“全局”模块路径(此处的“全局”表示不使用 virtualenv 时的系统范围,或者在 virtualenv 的 python 模块中)。

您的 PyCharm 注意到它正在使用 neo4j-driver 模块的版本 1.5.3,但是 pip 拉入您的 .egg 执行环境的版本是 1.6.0a,这是在依赖关系解析时的最新版本。因此,当从 shell 执行它时,您使用的是不同版本的 neo4j-driver

这本身并没有那么糟糕,但是......

目前在 neo4j-driver 1.5.3 和 1.6.0 之间存在重大更改。

1.6.0 更改了某些模块的路径,因此特定的导入可能会中断。正如您在示例中看到的那样,它似乎也改变了一些数据对象的格式。

起初,这似乎只是使用版本不稳定标签的结果,但很有可能这些更改可能会保留下来,因为它是一个新版本。

为确保 pip/setuptools 安装相同的版本,请固定版本号。

1.6.0 在某些方面彻底改变了 API。由于您是针对 1.5.3 进行开发的,因此您将不得不更改您的 API 以处理这两个版本(并且可能在未来的更新发布时再次破坏它),或者将其固定到特定版本。

要固定它,通过从构建目录中删除所有二进制文件来清除所有现有版本的 neo4j-driver,使用 pip 卸载它,然后更新您的 setup.py 或其他依赖项管理工具以指向您正在开发的特定版本与。

对于setup.py,在install_requirestests_require 或其他相关部分的库名称末尾添加==1.5.3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多