2015-07-17 2 views
1

Я пытаюсь создать огромную базу данных в neo4j, которая будет иметь около 2 миллионов узлов и около 4 миллионов ребер. Я смог ускорить процесс создания узла, создав узел в партиях по 1000 узлов каждый. Однако, когда я пытаюсь создать ребра между этими узлами, процесс замедляется, а затем истекает время. Первоначально я, хотя это могло быть медленным, поскольку я сливался по имени узла, но его медленнее, даже если я использую идентификаторы - я вручную создаю эти идентификаторы. Ниже я дал отрезал для данных и коды, для лучшего понимания проблемы -Ускорение создания ребер между узлом в Neo4j с использованием Py2Neo

  1. Node.csv - этот файл содержит информацию о узле

    NodeName NodeType NodeId Sachin Person 1 UNO Organisation 2 Obama Person 3 Cricket Sports 4 Tennis Sports 5 USA Place 6 India Place 7

  2. Edges.csv - это файл содержит только узловые идентификаторы и их отношения

    Node1Id Relationship Node2Id 1 Plays 4 3 PresidentOf 6 1 CitizenOf 7

код для создания узла приводится ниже -

from py2neo import Graph 
graph = Graph() 
statement ="" 
tx = graph.cypher.begin() 
for i in range(len(Node)): 
    statement = "Create(n{name:{A} ,label:{C}, id:{B}})" 
    tx.append(statement,{"A": Node[i][0],"C":str(Node[i][1]), "B":str(Node[i][2])}) 
    if i % 1000 == 0: 
     print str(i) + "Node Created" 
     tx.commit() 
     tx = self.graph.cypher.begin() 
     statement ="" 

Над кодом работает как чудо и закончил создание 2 млн узлов в течение 5 минут. кода для создания ребер приводятся ниже -

tx = graph.cypher.begin() 
statement = "" 
for i in range(len(Edges)): 
    statement = "MATCH (a {id:{A}}), (b {id:{B}}) CREATE (a)-[:"+ Edges[i][1]+"]->(b)" 
    tx.append(statement, {"A": Edges[i][0], "B": Edges[i][2]}) 
     if i % 1000 == 0: 
      print str(i) + " Relationship Created" 
      tx.commit() 
      tx = graph.cypher.begin() 
      statement = "" 

Выше код работает хорошо для создания первых 1000 отношений, но после того, что она занимает много времени, и соединение получает тайм-аут.

Мне срочно нужно исправить это, и любая помощь, которая может закрепить процесс создания отношений, была бы действительно полезна.

Обратите внимание: я не использую импорт csv из импорта оболочки Neo4j или Neo4j, поскольку они предполагают связь между узлами, которые должны быть исправлены. Принимая во внимание, что для меня отношения меняются, и его невозможно импортировать за одну взаимосвязь за раз, потому что это будет означать импорт почти в 2000 раз вручную.

+0

У вас есть указатель (желательно ограничение уникальности) на свойство 'id'? –

+0

Майкл предложил то же самое в нижнем ответе, и он работает как волшебство. Благодаря! – Pawan

ответ

2

Вы забыли использовать метку для своих узлов, а затем создать ограничение на ярлыке + id.

create constraint on (o:Organization) assert o.id is unique; 
create constraint on (p:Person) assert p.id is unique; 

Create(n:Person {name:{A} ,id:{B}}) 
Create(n:Organization {name:{A} ,id:{B}}) 

match (p:Person {id:{p_Iid}), (o:Organization {id:{o_id}}) 
create (p)-[:WORKS_FOR]->(o); 
+0

Спасибо большое! он работал как чудо. Всего создание базы данных заняло 10 минут – Pawan

Смежные вопросы