Создание новых узлов и добавление отношений к существующим

У меня есть небольшой график, в нем есть «родительские» узлы (как в узлах, которые определяют родителя дочернего элемента) и «дочерние» узлы (дочерние элементы указанных родителей). Я заметил небольшую проблему в том, как я создаю братьев и сестер существующих детей, и надеялся на некоторые указатели.

return client.Cypher
            .Match("(person:Person),(c:IdCounter)")
            .Where((Person person) => person.Email == '[email protected]')
            .Create("person-[:PARENT_OF]->(child:Child {name:'fred',dob:timestamp()})")
            .Set("child.timestamp = timestamp()")
            .Set("child.id = c.nextId")
            .Set("c.nextId = c.nextId + 1")
            .Return<Child>("child").Results.ToList();

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

return client.Cypher
            .Match("(child:Child)<-[:PARENT_OF]-(person:Person),(c:IdCounter)")
            .Where((Person person) => person.Email == '[email protected]')
            .Create("(child2:Child {name:'derf',dob:timestamp()})")
            .Set("child2.id = c.nextId")
            .Set("c.nextId = c.nextId + 1")
            .Create("(person)-[:PARENT_OF]->(child2)")
            .Create("(child2)-[:SIBLING_OF]->(child)")
            .Return<Child>("child2").Results.ToList();

Теперь, когда я впервые запускаю этот одноуровневый код, я получаю второго дочернего элемента, связанного с родителем и связанного с его родным братом, поэтому в большинстве случаев это было бы хорошо, но у меня есть 4 дочерних элемента:/

Во второй раз, когда я запускаю родственный код, я получаю 2 дочерних элемента (один и тот же дочерний элемент дважды с последовательными идентификаторами), и они связаны с родителем (PARENT_OF), но 1 новый дочерний элемент ссылается на 1 существующий дочерний элемент (SIBLING_OF), а второй новый дочерние ссылки на другого существующего дочернего элемента (SIBLING_OF). РЕДАКТИРОВАТЬ: это используемый Cypher и результирующий график после двукратного запуска родственного кода: http://ec2-52-89-85-67.us-west-2.compute.amazonaws.com/imagedata/capture.png
ожидал бы, что будет создан 1 новый дочерний элемент, и отношение SIBLING_OF будет создано для дочерних элементов, собранных в исходном выражении соответствия, но это не то, что я получаю.

Спасибо


person Shaine Fisher    schedule 19.10.2015    source источник


Ответы (2)


Это должно вас заинтересовать:

client.Cypher
    .Match("(c:IdCounter)")
    .Create("(child2:Child {name:'derf',dob:timestamp()})")
    .Set("child2.id = c.nextId")
    .Set("c.nextId = c.nextId + 1")
    .With("child2")
    .Match("(child:Child)<-[:PARENT_OF]-(person:Person)")
    .Where((Person person) => person.Email == "[email protected]")
    .CreateUnique("(person)-[:PARENT_OF]->(child2)")
    .CreateUnique("(child2)-[:SIBLING_OF]->(child)")
    .Return<Child>("DISTINCT child2");

Или, по крайней мере, он создает то, что, как я думаю, вам нужно - все дочерние элементы связаны вместе, а родитель - один rel для каждого дочернего элемента.

person Charlotte Skardon    schedule 20.10.2015
comment
Вы что-то знаете, я собираюсь принять ваш ответ, хотя мой выше сделал ту работу, которую я хотел, я на самом деле не помнил о счетчике для столбца id (потому что я тестировал в браузере и удалял много вещей, как я Это. Так что за то, что у вас есть весь код и в правильном порядке, вы получаете баллы. Спасибо, Крис. - person Shaine Fisher; 20.10.2015
comment
Просто быстрый комментарий, '.CreateUnique((child2)-[:SIBLING_OF]-›(child))' на самом деле ничего не делает :( Сейчас я работаю над этим, но подумал, что вы должны знать: ec2-52-89-85-67. us-west-2.compute.amazonaws.com/imagedata/ - person Shaine Fisher; 20.10.2015
comment
На самом деле - хммм, я почти уверен, что у всех детей есть "брат и сестра" - person Charlotte Skardon; 21.10.2015
comment
Да, вы делаете, и я тоже: / Мы вызывали код AddChild вместо AddSibling, полная ошибка со стороны наших тестировщиков, извиняюсь, Крис, отсортировано. - person Shaine Fisher; 21.10.2015

Итак, я решил вопрос, все было в порядке вещей, и я этого не осознавал. Чтобы сделать то, что я хотел, мне пришлось использовать это:

create(child2:Child{FirstName:'Sarah',LastName:'Fisher',DateOfBirth:1281222000000,id:118,timestamp:timestamp(),x120:'/',x160:'/',x240:'/',x320:'/',x480:'/',x640:'/',thumbnail:'/',Gender:'Female'})
with child2
match (person:Person{Email:'[email protected]'})-[:PARENT_OF]-(child:Child)
create unique(person)-[:PARENT_OF{timestamp:timestamp()}]->(child2)
create(child2)-[:SIBLING_OF{timestamp:timestamp()}]->(child)
return person,child,child2

Как видите, теперь я сначала создаю дочерний элемент и использую WITH для создания отношений, но мне также нужно было использовать CREATE UNIQUE для отношения PARENT_OF, чтобы остановить дублирование.

Проблема решена, спасибо :)

person Shaine Fisher    schedule 20.10.2015
comment
Если бы у меня был лучше WiFi, я бы ответил пару часов назад - я бродил вокруг в поисках места :) - person Charlotte Skardon; 20.10.2015