#python #performance #neo4j #relationship #py2neo
Вопрос:
Я пытаюсь создавать пакетные связи в базе данных neo4j, используя массовый api py2neo create_relationship()
. У меня есть несколько типов отношений (например ,знает, следует и т.д.) В списке, а также я хочу создать большое количество отношений (более 30 миллионов) в базе данных графиков. В настоящее время я использую Neo4j Desktop 1.4.7 и python версии 3.9.
Я создавал узлы пакетами, используя create_nodes()
py2neo.bulk api.
Ниже приведен пример кода для того же:
from py2neo import Graph
from py2neo.bulk import create_nodes,create_relationships
from py2neo.data import Node
graph = Graph(auth=('neo4j', 'abc123'))
one_node=Node("Person", name="Alice", nid="01")
two_node=Node("Person", name="ACME", nid="02")
t_node=Node("Person", name="Mahi", nid="03")
f_node=Node("Person", name="Ali", nid="04")
data = []
data.append(one_node)
data.append(two_node)
data.append(t_node)
data.append(f_node)
try:
create_nodes(graph.auto(), data, labels={"Person"})
except Exception as error:
print(error)
try:
graph.run("CREATE INDEX ON :Person(nid)")
except Exception as error:
print(error)
#I have created a relationship using create_relationship() api of
#py2neo.bulk. Below is the sample code for the same.
rel_data= [
("01", {}, "02"),
("03", {}, "04"),
]
try:
create_relationships(graph.auto(), rel_data, "WORKS_FOR",
start_node_key=("Person", "nid"), end_node_key=("Person", "nid"))
except Exception as error:
print(error)
Я сталкиваюсь со следующими проблемами запросов:
- В приведенном выше коде, если я предоставлю один тип связи для всех 30 миллионов узлов, данные будут вставлены всего за 74 секунды. Но данные, которые я хочу вставить в Neo4j, имеют несколько типов отношений (например, файл, на который я ссылаюсь, содержит 79 типов отношений, каждый из которых имеет свой собственный набор данных). Поэтому я 79 раз вызывал
create_relationship()
API с его собственными данными, и на это ушло 9 минут. Таким образом, вывод заключается в том, что один тип отношения обеспечивает лучшую производительность, можем ли мы предоставить несколько типов отношений за один раз вcreate_relationship()
API. - В приведенном выше коде, если я не предоставлю ключ запуска и ключ завершения
create_relationship()
API, производительность для создания ребер станет быстрой, но некоторые ребра отсутствуют, но если я предоставлю ключ запуска и ключ завершения (как показано в приведенном выше коде), производительность снизится. Итак, есть ли лучший способ создать большое количество отношений? Просто к вашему сведению, в нашем случае мы не хотим использоватьLoad csv
запрос, пожалуйста, предложите какое-нибудь другое решение, если это возможно. - Во время расследования я нашел некоторые образцы
WriteBatch
из библиотеки py2neo для создания нашего собственного пакета, но я не смог импортировать модуль neo4j в py2neo, который имеетWriteBatch()
API, поскольку я использую py2neo версии 2021.1. Итак, есть ли способ исправить эту проблему или есть какой-либо альтернативный способ создания собственных пакетов с помощью py2neo.
Заранее спасибо.
Комментарии:
1. Я уже ответил на этот вопрос на странице вопросов проекта GitHub:… github.com/py2neo-org/py2neo/issues/911#issuecomment-894345552