Не удалось выполнить операцию WriteBatch с помощью py2neo

Я пытаюсь найти обходное решение для следующей проблемы. Я видел это квазиописанным в этом вопросе SO , но на самом деле не ответил.

Следующий код не работает, начиная со следующего графика:

from py2neo import neo4j def add_test_nodes(): # Add a test node manually alice = g.get_or_create_indexed_node("Users", "user_id", 12345, {"user_id":12345}) def do_batch(graph): # Begin batch write transaction batch = neo4j.WriteBatch(graph) # get some updated node properties to add new_node_data = {"user_id":12345, "name": "Alice"} # batch requests a = batch.get_or_create_in_index(neo4j.Node, "Users", "user_id", 12345, {}) batch.set_properties(a, new_node_data) #<-- I'm the problem # execute batch requests and clear batch.run() batch.clear() if __name__ == '__main__': # Initialize Graph DB service and create a Users node index g = neo4j.GraphDatabaseService() users_idx = g.get_or_create_index(neo4j.Node, "Users") # run the test functions add_test_nodes() alice = g.get_or_create_indexed_node("Users", "user_id", 12345) print alice do_batch(g) # get alice back and assert additional properties were added alice = g.get_or_create_indexed_node("Users", "user_id", 12345) assert "name" in alice 

Короче говоря, я хочу, чтобы в одной пакетной транзакции обновлять существующие свойства индексированных узлов. Ошибка происходит в строке batch.set_properties , и это происходит потому, что объект BatchRequest возвращенный предыдущей строкой, не интерпретируется как допустимый узел. Хотя и не совсем indentical, мне кажется, что я пытаюсь что-то вроде ответа, размещенного здесь

Некоторые особенности

 >>> import py2neo >>> py2neo.__version__ '1.6.0' >>> g = py2neo.neo4j.GraphDatabaseService() >>> g.neo4j_version (2, 0, 0, u'M06') 

Обновить

Если я разделить проблему на отдельные партии, то она может работать без ошибок:

 def do_batch(graph): # Begin batch write transaction batch = neo4j.WriteBatch(graph) # get some updated node properties to add new_node_data = {"user_id":12345, "name": "Alice"} # batch request 1 batch.get_or_create_in_index(neo4j.Node, "Users", "user_id", 12345, {}) # execute batch request and clear alice = batch.submit() batch.clear() # batch request 2 batch.set_properties(a, new_node_data) # execute batch request and clear batch.run() batch.clear() 

Это работает и для многих узлов. Хотя мне не нравится идея раскола партии, это может быть единственным способом на данный момент. У кого-нибудь есть замечания по этому поводу?

2 Solutions collect form web for “Не удалось выполнить операцию WriteBatch с помощью py2neo”

После прочтения всех новых функций Neo4j 2.0.0-M06, кажется, что прежний рабочий процесс индексов узлов и отношений заменяется. В настоящее время есть немного расхождения со стороны нео в том, как делается индексация. А именно, метки и схемы индексов .

Этикетки

Ярлыки могут быть произвольно привязаны к узлам и могут служить ссылкой для индекса.

Индексы

Индексы могут быть созданы в Cypher путем ссылки на ярлыки (здесь, User ) и ключ свойства узла, ( screen_name ):

 CREATE INDEX ON :User(screen_name) 

Cypher MERGE

Кроме того, индексированные методы get_or_create теперь возможны с помощью новой функции cypher MERGE , которая включает в себя ярлыки и их индексы довольно лаконично:

 MERGE (me:User{screen_name:"SunPowered"}) RETURN me 

партия

Запросы сортировки можно py2neo в py2neo , добавив экземпляр CypherQuery к пакетному объекту:

 from py2neo import neo4j graph_db = neo4j.GraphDatabaseService() cypher_merge_user = neo4j.CypherQuery(graph_db, "MERGE (user:User {screen_name:{name}}) RETURN user") def get_or_create_user(screen_name): """Return the user if exists, create one if not""" return cypher_merge_user.execute_one(name=screen_name) def get_or_create_users(screen_names): """Apply the get or create user cypher query to many usernames in a batch transaction""" batch = neo4j.WriteBatch(graph_db) for screen_name in screen_names: batch.append_cypher(cypher_merge_user, params=dict(name=screen_name)) return batch.submit() root = get_or_create_user("Root") users = get_or_create_users(["alice", "bob", "charlie"]) 

ограничение

Однако существует ограничение на то, что результаты запроса cypher в пакетной транзакции не могут быть указаны позже в той же транзакции. Первоначальный вопрос касался обновления коллекции индексированных свойств пользователя в одной пакетной транзакции. Насколько это возможно, это пока невозможно. Например, следующий фрагмент вызывает ошибку:

 batch = neo4j.WriteBatch(graph_db) b1 = batch.append_cypher(cypher_merge_user, params=dict(name="Alice")) batch.set_properties(b1, dict(last_name="Smith")}) resp = batch.submit() 

Таким образом, кажется, что, хотя для реализации get_or_create над помеченным узлом существует немного меньше накладных расходов, используя py2neo потому что устаревшие индексы больше не нужны, исходный вопрос по-прежнему требует двух отдельных пакетных транзакций.

Ваша проблема, похоже, не в batch.set_properties() а скорее на выходе batch.get_or_create_in_index() . Если вы добавите узел с помощью batch.create() , он будет работать:

 db = neo4j.GraphDatabaseService() batch = neo4j.WriteBatch(db) # create a node instead of getting it from index test_node = batch.create({'key': 'value'}) # set new properties on the node batch.set_properties(test_node, {'key': 'foo'}) batch.submit() 

Если вы посмотрите на свойства объекта BatchRequest, возвращенные параметрами batch.create() и batch.get_or_create_in_index() в URI существует различие, поскольку методы используют разные части API-интерфейса REST-neo4j:

 test_node = batch.create({'key': 'value'}) print test_node.uri # node print test_node.body # {'key': 'value'} print test_node.method # POST index_node = batch.get_or_create_in_index(neo4j.Node, "Users", "user_id", 12345, {}) print index_node.uri # index/node/Users?uniqueness=get_or_create print index_node.body # {u'value': 12345, u'key': 'user_id', u'properties': {}} print index_node.method # POST batch.submit() 

Поэтому я предполагаю, что batch.set_properties() каким-то образом не может обрабатывать URI индексированного узла? Т.е. он действительно не получает правильный URI для узла?

Не решает проблему, но может быть указателем для кого-то другого;)?

  • Ошибка авторизации py2neo для Python Neo4j
  • py2neo - Neo4j - Системная ошибка - создание пакетных узлов / отношений
  • Как импортировать узлы python node в neo4j?
  • Проверка валидации в WTForms не обновляется, когда база данных
  • Импорт большого файла xml в Neo4j с Py2neo
  •  
    Interesting Posts for Van-Lav

    Разница между django-webtest и селеном

    Как я могу сделать видео из массива изображений в matplotlib?

    Подсчет общего количества задач, выполняемых при многопроцессорной обработке.

    Как изменить цвет текстового курсора в Tkinter?

    Как анализировать данные из листа excel со многими таблицами (используя Python, возможно, Pandas)

    Могу ли я использовать 32-битную dll или exe в 64-битном python?

    Импортировать функцию из класса в другой файл?

    tput: атрибуты терминала: нет такого устройства или адреса в отладчике Windows Pycharm

    Получение более полезного вывода ошибок модуля «logging» в python

    Django: хотите отобразить пустое поле как пустое, а не отображать None

    Получить код ошибки HTTP из request.exceptions.HTTPError

    Неточные результаты логарифма и функции мощности в Python

    Как использовать CommaSeparatedIntegerField в django?

    Добавление пространства имен xsi: type и envelope при использовании SUDS

    Python: запуск подпроцесса параллельно

    Python - лучший язык программирования в мире.