2015-12-09 3 views
1

Я в начале neo4j, и я использую python3.5 и py2neo.Как создать связь между существующими двумя узлами, я использую neo4j.

У меня было построено два узла графа со следующим кодом. и успешно создать. [!

>>> u1 = Node("Person",name='Tom',id=1) 
>>> u2 = Node('Person', name='Jerry', id=2) 
>>> graph.create(u1,u2) 

enter image description here

после этого, я собираюсь сделать связь между «Тома» и свойство идентификатора «Джерри» Тома является 1, свойство идентификатора Джерри равно 2.

Зв Я думаю, я должен указать на существующие два узла, используя свойство id. , а затем я попытался создать отношение, как показано ниже.

>>> u1 = Node("Person",id=1) 
>>> u2 = Node("Person",id=2) 
>>> u1_knows_u2=Relationship(u1, 'KKNOWS', u2) 
>>> graph.create(u1_knows_u2) 

более успешно успешно. Но график что-то странное.

enter image description here

Я не знаю, почему неизвестные узлы графа созданы. и почему связь создается между неизвестным двумя узлами.

ответ

4

У вас могут быть два узла с одинаковой меткой и одинаковыми свойствами. Второй узел, который вы получаете с u1 = Node("Person",id=1), - это не тот, который вы создали ранее. Это новый узел с тем же ярлыком/свойством.

Когда вы определяете два узла (т. Е. Ваши новые u1 и u2) и создаете отношения между ними, будет создан весь шаблон.

Чтобы получить два узла и создать связь между ними вы могли бы сделать:

# create Tom and Jerry as before 
u1 = Node("Person",name='Tom',id=1) 
u2 = Node('Person', name='Jerry', id=2) 
graph.create(u1,u2) 

# either use u1 and u2 directly 
u1_knows_u2 = Relationship(u1, 'KKNOWS', u2) 
graph.create(u1_knows_u2) 

# or find existing nodes and create a relationship between them 
existing_u1 = graph.find_one('Person', property_key='id', property_value=1) 
existing_u2 = graph.find_one('Person', property_key='id', property_value=2) 

existing_u1_knows_u2 = Relationship(existing_u1, 'KKNOWS', existing_u2) 
graph.create(existing_u1_knows_u2) 

find_one() предполагает, что ваши id свойства уникальны.

2

Заметим также, что вы можете использовать Cypher язык запросов с Py2neo:

graph.cypher.execute(''' 
    MERGE (tom:Person {name: "Tom"}) 
    MERGE (jerry:Person {name: "Jerry"}) 
    CREATE UNIQUE (tom)-[:KNOWS]->(jerry) 
''') 

MERGE заявление в Cypher похож на «получить или создать». Если узел Person с заданным именем «Том» уже существует, он будет привязан к переменной tom, если не будет создан узел, а затем привязан к tom. Это, в сочетании с добавлением uniqueness constraints, позволяет избежать нежелательных дублирующих узлов.

2

Проверить этот запрос,

MATCH (a),(b) WHERE id(a) =1 and id(b) = 2 create (a)-[r:KKNOWS]->(b) RETURN a, b 
Смежные вопросы