Создайте узлы Neo4j, передав переменную данных в Python

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

(В скрипте Python)

Product_IDs = data_array[1:1000] # Содержит список идентификаторов продуктов.

tot_node_num = len(Product_IDs) # Указывает общее количество идентификаторов продуктов

график = График()

tx = график.cypher.begin()

tx.append("FOREACH (r IN range(1,tot_node_num) | CREATE (:Product {ID:Product_IDs[r]}))")

tx.commit()

С приведенным выше оператором переменные: tot_node_num и Product_IDs не распознаются. Как я могу передать массив, который я создал с помощью своего скрипта Python, для создания узлов в графовой базе данных Neo4j?

Благодарю вас!


person user4279562    schedule 25.11.2014    source источник
comment
Решил вышеуказанную проблему, поместив {} вокруг имени переменной и добавив определение параметра. Таким образом, в конце это выглядело так: tx.append(FOREACH (r IN range(1,{tot_node_num}) | CREATE(:Product{ID: {Product_IDs}[r]})), parameters={'tot_node_num':tot_node_num , 'Product_IDs':Product_IDs})   -  person user4279562    schedule 25.11.2014


Ответы (1)


Вы абсолютно правы - лучший способ передачи переменных - через параметры. Однако имейте в виду, что, хотя это работает для выражений и значений свойств, параметры нельзя использовать для меток и типов отношений. Чтобы помочь в этом, py2neo предоставляет функцию cypher_escape (http://py2neo.org/2.0/cypher.html#py2neo.cypher.cypher_escape):

>>> from py2neo.cypher import cypher_escape
>>> rel_type = "KNOWS WELL"
>>> "MATCH (a)-[:%s]->(b) RETURN a, b" % cypher_escape(rel_type)
'MATCH (a)-[:`KNOWS WELL`]->(b) RETURN a, b'
person Nigel Small    schedule 25.11.2014
comment
Спасибо, Найджел! Это отличный совет! - person user4279562; 26.11.2014