py2neo: пакетное создание индексированного узла с несколькими парами ключ: значение

С участием

batch = neo4j.WriteBatch(graph_db)
for n in nodes:
    batch.create_indexed_node_or_fail(index, key, value, {node properties})
batch.submit()

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

Но как я могу создать узел в пакете и одновременно добавить несколько пар ключ: значение? Или добавить узел к нескольким индексам?

Одна идея, о которой я подумал, состоит в том, чтобы сначала создать узлы, а затем добавить их к индексам во втором пакете:

for n in nodes:
    batch.create({node properties})
results = batch.submit()

for r in results:
    batch add node to index1
    batch add node to index2
batch.submit()

Но это кажется сложным. Py2neo настолько удивителен, что должен быть более простой способ.


Основываясь на ответе Найджела, я попытался получить список узлов:

batch = neo4j.WriteBatch(graph_db)
item_in_batch = 0

for n in list_of_nodes:
    batch.create(n) # this works, all nodes are created
    batch.add_indexed_node("people", "key", "value from n", item_in_batch)
    batch.add_indexed_node("people", "key2", "other value from n", item_in_batch)
    i += 1
batch.submit()

Некоторые узлы попадают в мой индекс, но не все. Когда я ищу в индексе ('ключ: значение-из-n"), он возвращает узел, но не правильный. Как я могу получить доступ к «внутреннему» идентификатору узлов, когда я пытаюсь добавить их в индекс?


Я попробовал (в настоящее время тестирую) версию 1.6.0 py2neo, и она работает!

n = batch.create(node)

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

Пример приведен в документации для версии 1.6.0.


person Martin Preusse    schedule 21.08.2013    source источник


Ответы (1)


Вам не нужно две партии. Вы должны иметь возможность создавать и добавлять в одном пакете. Что-то типа:

batch = neo4j.WriteBatch(graph_db)
batch.create({"name": "Alice})
batch.add_indexed_node("people", "name", "Alice", 0)
batch.add_indexed_node("employees", "id", 2345678, 0)
batch.add_indexed_node("fighter_pilots", "call_sign", "Silver Eagle", 0)
batch.submit()

Для уникальной индексации вместо этого вы можете использовать add_indexed_node_or_fail.

И спасибо за комплимент :-)

person Nigel Small    schedule 21.08.2013
comment
Спасибо, Найджел! Я попробую это. Я как бы не понимаю, почему я могу ссылаться на последний узел с помощью «0». У него будет другой идентификатор в neo4j, верно? Будет ли это также работать, если batch.create() и batch.add_indexed_node() находятся в цикле и отправляются после создания пары сотен узлов? Я думаю, мне нужно взглянуть на ваш код, чтобы лучше понять это :) - person Martin Preusse; 24.08.2013
comment
Ноль не относится к идентификатору узла, созданному сервером, он относится к нулевому элементу в этом пакете, в данном случае к вновь созданному узлу. - person Nigel Small; 24.08.2013
comment
Это работает для отдельных узлов, но не в том случае, если я создам больше в своем пакете. Я думаю, что это не относится к правильному элементу в пакете, когда я повторяю. Я отредактировал свой вопрос с кодом, любая помощь будет оценена;) - person Martin Preusse; 10.09.2013
comment
Попробовал версию 1.6.0 и все работает! Вопрос отредактирован... извините за спам :) - person Martin Preusse; 10.09.2013
comment
Это делает меня счастливым :-) - person Nigel Small; 11.09.2013