Почему драйвер затвора Neo4j несовместим между оболочкой и IDE?
Я вижу странное поведение с 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
- Есть ли лучший способ разобрать недействительный контент в диктовку?
1 ответ
У вас есть расхождения в ваших средах исполнения.
Даже если вы используете одну и ту же виртуальную среду как для выполнения оболочки, так и для интерпретатора проекта PyCharm, при выполнении.egg среда выполнения может быть изменена для загрузки свежих копий всех библиотек, которые необязательно устанавливаются в "глобальную". путь к модулю (здесь "глобальный" означает либо общесистемный, когда не используется virtualenv, либо в модулях python для virtualenv).
Ваш PyCharm отмечает, что он использует версию 1.5.3
из neo4j-driver
модуль, но версия, которую pip вытащил в вашу среду выполнения.egg, 1.6.0a
самое последнее на время разрешения зависимости. И вот, при выполнении его из оболочки, вы используете другую версию neo4j-driver
,
Это само по себе не было бы так плохо, но...
В настоящее время происходят серьезные изменения между 1.5.3 и 1.6.0 в драйвере neo4j.
1.6.0 изменил пути некоторых модулей, поэтому некоторые операции импорта могут прерваться. Кажется, он также изменил формат некоторых своих объектов данных, как вы видели в своем примере.
Поначалу может показаться, что это всего лишь следствие использования нестабильного тега версии, но вполне возможно, что эти изменения могут остаться здесь, поскольку это новая версия.
Чтобы убедиться, что та же версия установлена с помощью pip/setuptools, введите номер версии.
1.6.0 радикально изменил API в некоторых отношениях. Поскольку вы разрабатывали версию 1.5.3, вам придется либо изменить свой API для обработки обеих версий (и, возможно, рискнуть его снова сломать при выпуске будущих обновлений), либо прикрепить его к определенной версии.
Чтобы закрепить это, сотрите все существующие версии neo4j-driver
удалив все двоичные файлы из вашей сборки, удалите его с помощью pip, а затем обновите setup.py
или другой инструмент управления зависимостями, указывающий на конкретную версию, с которой вы разрабатываете.
За setup.py
, добавлять ==1.5.3
в конце названия библиотеки в install_requires
, tests_require
или другие соответствующие разделы.