Создавайте пакетные связи в базе данных neo4j с помощью py2neo bulk API (с несколькими типами отношений).

#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)
 

Я сталкиваюсь со следующими проблемами запросов:

  1. В приведенном выше коде, если я предоставлю один тип связи для всех 30 миллионов узлов, данные будут вставлены всего за 74 секунды. Но данные, которые я хочу вставить в Neo4j, имеют несколько типов отношений (например, файл, на который я ссылаюсь, содержит 79 типов отношений, каждый из которых имеет свой собственный набор данных). Поэтому я 79 раз вызывал create_relationship() API с его собственными данными, и на это ушло 9 минут. Таким образом, вывод заключается в том, что один тип отношения обеспечивает лучшую производительность, можем ли мы предоставить несколько типов отношений за один раз в create_relationship() API.
  2. В приведенном выше коде, если я не предоставлю ключ запуска и ключ завершения create_relationship() API, производительность для создания ребер станет быстрой, но некоторые ребра отсутствуют, но если я предоставлю ключ запуска и ключ завершения (как показано в приведенном выше коде), производительность снизится. Итак, есть ли лучший способ создать большое количество отношений? Просто к вашему сведению, в нашем случае мы не хотим использовать Load csv запрос, пожалуйста, предложите какое-нибудь другое решение, если это возможно.
  3. Во время расследования я нашел некоторые образцы WriteBatch из библиотеки py2neo для создания нашего собственного пакета, но я не смог импортировать модуль neo4j в py2neo, который имеет WriteBatch() API, поскольку я использую py2neo версии 2021.1. Итак, есть ли способ исправить эту проблему или есть какой-либо альтернативный способ создания собственных пакетов с помощью py2neo.

Заранее спасибо.

Комментарии:

1. Я уже ответил на этот вопрос на странице вопросов проекта GitHub:… github.com/py2neo-org/py2neo/issues/911#issuecomment-894345552