我有一个链表,在neo4j中看起来像这样:
CREATE (p:Procedure {id:1})
CREATE (s1:Step {title:"Do Thing 1"})
CREATE (s2:Step {title:"Do Thing 2"})
MERGE (p)-[:FIRST_STEP {parent:[1]}]->(s1)-[:NEXT {parent:[1]}]->(s2)
现在我可以创建另一个包含此列表的列表,为了实现这一点,我要么创建一个单独的一组关系,并使用新的父值,或者我将新的父ID添加到父母名单:例如父[1,2]。
现在,可以像这样做一场比赛:
match (p:Procedure)-[rel:FIRST_STEP|NEXT*]->(steps)
WHERE p.id = 1 and 1 in rel.parent
return p, steps
如果我将约束放在关系的初始声明中,我可以这样做,例如-[rel:FIRST_STEP|NEXT* {parent:1}]->
,但这并不允许我做" IN"查询。
非常感谢任何想法或方向。
答案 0 :(得分:1)
是否有任何预期的用例会以某种方式修改列表,例如插入,重新排列或删除节点?如果是这样,一个列表的更改是否反映了另一个列表的更改?
如果存在这些用例,并且列表更改旨在保持彼此同步,则与父ID列表的单一关系是有意义的(尽管APOC过程库包含可以处理任一设计的图形重构过程)
如果对一个列表的更改无意反映在另一个列表中,那么每个父级的单独关系最有意义。
另外,据我所知,从列表中减去元素并不容易(可以使用“+”添加元素,但不能使用“ - ”)。我认为你必须使用filter()
来做这件事,这有点尴尬。在语法上完全删除关系比从关系列表中删除元素更容易,尽管这可能不会成为您设计选择的驱动因素。