2015-04-21 4 views
0

Мой код добавляет кивки и создает отношения. Он обновляется, когда соединение является a-> b, a-> c, a-> d, оно работает (к узлу добавляются новые отношения), но когда я добавляю соединение f-> a, то второй узел с именем a является создано. Как я могу сделать это для обновления существующего узла a?Обновление узла neo4j с новыми отношениями, используя py2neo

graph = Graph() 
with open('test2') as fp: 
    for line in fp: 
     result = line.split('\t') 
     category1 = graph.merge_one("Category", "name",result[0][result[0].rfind(':')+1:]) 
     category2 = graph.merge_one("Category", "name",result[1][result[1].rfind(':')+1:]) 
     print result[0][result[0].rfind(':')+1:] +"|"+result[1][result[1].rfind(':')+1:] 
     graph.create_unique(Path(category1, "SubCategoryOf", category2)) 

Мои тестируемых файлов:

Категория: Wars_involving_Burma Категория: Wars_by_country Категория: Wars_involving_Burma Категория: Military_history_of_Burma Категория: Wars_involving_Burma Категория: Foreign_relations_of_Burma Категория: World_War_II Категория: Wars_involving_Bulgaria Категория: World_War_II Категория : Wars_involving_Burma

В этом примере

Категория: Wars_involving_Burma

создается дважды.

ответ

0

Когда я запускаю ваш пример, я не получаю узел дважды. Из вашего вопроса я не могу сказать, сколько «Категория: ...» у вас есть в каждой строке. Из того, как вы разделили линию, я предположил, что это всегда два. Одна из возможных проблем заключается в том, что вы не удаляете окончания строк, поэтому один из ваших узлов «Category: Wars_involving_Burma» может иметь символ новой строки в конце. Также вы наклеивали space, а не \t.

Вот предложение, как улучшить свой код, предполагая, что ваш файл выглядит http://paste.ubuntu.com/10874106/

graph = Graph() 

with open('test2') as fp: 
    for line in fp: 
     # strip the line ending first, then split by whitespace 
     # I assume every line has to category entries? 
     result = line.rstrip().split() 

     # getting the category name is easier and more readable like this 
     category1 = graph.merge_one("Category", "name", result[0].split(':')[1]) 
     category2 = graph.merge_one("Category", "name", result[1].split(':')[1]) 

     print result[0].split(':')[1] + '\t' + result[1].split(':')[1] 

     # you don't need a Path here   
     graph.create_unique((category1, "SubCategoryOf", category2)) 

Кроме того, если вы хотите, чтобы ваши «Категория» узлы должны быть уникальными, вы должны иметь уникальность ограничения на Свойство «name» узлов «Категория».

Cypher:

CREATE CONSTRAINT ON (n:Category) ASSERT n.name IS UNIQUE 

py2neo:

graph.schema.create_uniqueness_constraint('Category', 'name') 
+0

Спасибо, Мартин. Я уже нашел вопрос, что это была новая новая строка (\ n). Из-за этого, хотя имя выглядело одинаково в базе данных, оно было другим. Я считаю ваш ответ правильным, потому что ваш предложенный rstrip() решил бы это. – Andrejs

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