我有一个小图,它有'父'节点(如定义子节点的父节点)和'子节点'(所述父节点的子节点)。 我注意到我创建现有孩子的兄弟姐妹的方式存在一个小问题,并希望得到一些指示。
return client.Cypher
.Match("(person:Person),(c:IdCounter)")
.Where((Person person) => person.Email == 'shainefisher@hotmail.com')
.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 == 'shainefisher@hotmail.com')
.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个孩子(同一个孩子连续两次ID),并且他们链接到父母(PARENT_OF),但是1个新孩子链接到1个现有孩子(SIBLING_OF)和第二个新孩子链接到另一个现有孩子(SIBLING_OF)。
编辑:这是使用的Cypher和运行兄弟代码两次后的结果图:http://ec2-52-89-85-67.us-west-2.compute.amazonaws.com/imagedata/capture.png
我希望创建一个新的子节点,并为原始匹配语句中收集的子节点创建一个SIBLING_OF关系,但这不是我得到的。
由于
答案 0 :(得分:1)
这应该让你前进:
?is_first
或者至少它创造了我认为你所追求的东西 - 所有的孩子都在一起,而每个孩子的父母都是这样。
答案 1 :(得分:0)
所以,我解决了这个问题,这完全是秩序问题,我没有意识到这一点。为了做我想做的事我必须使用它:
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:'shainefisher@hotmail.com'})-[:PARENT_OF]-(child:Child)
create unique(person)-[:PARENT_OF{timestamp:timestamp()}]->(child2)
create(child2)-[:SIBLING_OF{timestamp:timestamp()}]->(child)
return person,child,child2
正如您所看到的,我现在首先创建子项,并使用WITH创建关系,但我还需要在PARENT_OF关系上使用CREATE UNIQUE来停止重复。
问题已解决,谢谢:)