neo4j - 通过模式理解减少/避免空节点上的可选匹配
问题描述
如何将属性设置为节点上相关节点属性的迭代,这些节点是我在 foreach 中遵循可选匹配的语句的结果?
我正在用新节点替换旧节点,并相应地更改与旧节点相关的节点的 ID。ID 是链接的新节点的串联。
我尝试了两个后续的可选匹配,但害怕如果第一个返回 null,那么第二个将匹配 ALL,这将是很多问题。
MATCH (old), (new)
...bunch of stuff...
WITH old, new
OPTIONAL MATCH (old)-[oldrel:HAS]->(parent)
FOREACH (o IN CASE WHEN parent IS NOT NULL THEN [parent] ELSE [] END|
MERGE (new)-[newrel:HAS]->(parent)
DELETE oldrel
SET parent.newID=[(parent)<-[:HAS]-(children) | REDUCE(iterate="", child IN children | iterate + "," + child.Property1+child.Property2)] )
也尝试过,但是当父母为空时有问题......
MATCH (old), (new)
...bunch of stuff...
WITH old, new
OPTIONAL MATCH (old)-[oldrel:HAS]->(parent)
FOREACH (o IN CASE WHEN parent IS NOT NULL THEN [parent] ELSE [] END| MERGE (new)-[newrel:HAS]->(parent))
DELETE oldrel
WITH old, new, parent
OPTIONAL MATCH (parent)<-[:HAS]-(children)
SET parent.newID=REDUCE(iterate="", child IN children | iterate + "," + child.Property1+child.Property2)
期望的结果:
如果 oldchild 1 具有属性 1: 3 和属性 2: X
并且 newchild 1 具有属性 1: 9 和属性 2: Y
然后父 ID1 从 3X,5Q 切换到 5Q,9Y(理想情况下以这种方式排序)
并且父 ID2 从 0P、3X、6S 切换到 0P、6S、9Y(理想情况下以这种方式排序)
如果 old 没有父节点,则没有节点交换 ID
解决方案
这可能对您有用:
MATCH (old), (new)
...bunch of stuff...
WITH old, new
MATCH (old)-[oldrel:HAS]->(parent)
MERGE (new)-[newrel:HAS]->(parent)
DELETE oldrel
WITH parent, new
OPTIONAL MATCH (parent)<-[:HAS]-(child)
WHERE child <> new
WITH parent, COLLECT(child) + new AS children
SET parent.newID=
REDUCE(iterate="", child IN children |
iterate + "," + child.Property1+child.Property2)
推荐阅读
- javascript - 使用 API 在琐事应用程序中转换特殊字符以验证答案的问题
- spring - 无法在 Spring Boot Data Cassandra App 中运行应用程序,因为语法查询错误在字符 'ı' 处没有可行的替代方案
- javascript - 如何从 v-for 循环中获取价值
- c# - $.ajaxFileUpload 正在触发 GET 和 POST 调用,有没有办法停止 GET 调用?
- python - 如何使用python脚本在expressVPN中自动跳转IP
- python - Plotly Dash 从循环中存储中间数据而不使用全局变量
- typescript - 使用 jest 和 ts-jest 模拟 @aws-sdk/client-dynamodb 模块时的奇怪行为
- python - 如何在蝗虫事件“请求成功”中获取用户数
- javascript - 使用 CSS 设计一个迷你选择按钮并使用 javascript 进行动态更改
- python - 机器学习参数化函数 f(x) = a*x1 + b*x2 + ... + n*xn