neo4j 使用列表将节点拆分为唯一节点并维护它们的关系

xqkwcwgp  于 2023-05-28  发布在  其他
关注(0)|答案(3)|浏览(197)

我的数据模型有2个Person节点,通过HAS_FORMS关系连接到一个Form节点。一个Form节点有一个names属性,其中包含一个名字列表(例如['solid', 'liquid','gas']['solid','liquid','gel']),我想让names中的每个值都成为一个节点,沿着到person节点的相关连接,另外我不想有任何重复。

我尝试在创建节点(具有副本)后添加约束,并且在使用unwind时尝试使用With distinct。我使用的代码:

我不能使用with distinct,因为它给出了一个错误(F是明确定义的)。

wribegjk

wribegjk1#

您可以将remove/detach form(f)命令放在查询的末尾。

match (n:Person)--(f:Form)
unwind f.names as nam
merge (n)-[:HAS_FORMS]-(:Form {names: nam})
detach delete f
2sbarzqh

2sbarzqh2#

在第二个代码块中,在with语句中没有沿着f

match (n:person)--(f:form)
unwind f.names as nam
with distinct nam, f
detach delete f
merge (n)-[:HAS_FORMS]-(:form {names:nam})

我不清楚你的图表。您希望节点是(:form)还是希望name属性是标签,例如(:solid)
如果你想要后者,你可以使用apoc.create.addLabels过程:https://neo4j.com/labs/apoc/4.4/graph-updates/graph-refactoring/property-value-label/
另外,这里只是一个建议,但您可能会考虑使用Neo4j的标准命名约定。它使你的代码更容易理解。
标签:MyLabel(caps for each word)
属性:myProperty(第一个单词后的每个单词大写)
关系:MY_RELATIONSHIP(全部大写,空格用下划线)

hk8txs48

hk8txs483#

您应该只尝试删除f一次(before you UNWIND)。此外,WITH子句消除了子句未指定的任何现有变量。
此查询应该可以工作:

MATCH (p:Person)-[:HAS_FORMS]->(f:Form)
WITH p, f, f.names AS names
DETACH DELETE f
WITH p, names
UNWIND names AS name
CREATE (p)-[:HAS_FORM]->(:Form {name: name})

请注意,我将新的关系类型更改为HAS_FORM,以使名称更准确。但这也允许您重新运行查询,而不触及新的关系。

相关问题