neo4j - Cypher - 数字有序关系
问题描述
我偶然发现了一个密码查询。我想创建一个关系,其中有一个基于每条指令的整数属性的隐式顺序。例如,当 WHERE 条件适用时,我想将 address_1 匹配到 address_2,将 address_2 匹配到 address_3,依此类推。这是尝试的声明:
MATCH (i:Instruction), (i2:Instruction)
WHERE i.address < i2.address AND i.vars_written = i2.vars_read
MERGE (i)-[r:USED_BY]->(i2)
RETURN i, i2, r
问题在于,较低编号的地址将映射到符合 WHERE 条件的所有其他地址,而不仅仅是映射到相关地址 - 在不应该存在的地方创建额外的关系,例如 address_1 到 address_3。
一条指令可能有多个 USED_BY 关系,但是一旦另一条指令具有相同的 vars_written 属性,它应该开始一个新的 USED_BY 关系。
为了提供一个具体示例,请考虑以下 4 个节点:
Index 1 parameters: {
address: 1
vars_written: var_b
vars_read: var_a
}
Index 2 parameters: {
address: 2
vars_written: var_c
vars_read: var_b
}
Index 3 parameters: {
address: 3
vars_written: var_c <- Same vars_written as Index 2
vars_read: var_b
}
Index 4 parameters: {
address: 4
vars_written: var_e
vars_read: var_c <- var_c was overwritten in Index 3, should NOT map to Index 2
}
产生:
1 -[USED_BY]-> 2
1 -[USED_BY]-> 3
2 -[USED_BY]-> 4 (This should not be made because 3 should only map to 4!)
3 -[USED_BY]-> 4
解决方案
感谢 Neo4J 团队在他们的 Slack 频道上的回答:
MATCH (i:Instruction), (i2:Instruction)
WHERE i.address < i2.address AND i.vars_written = i2.vars_read
WITH i, i2 ORDER BY i2.address ASC // <-- order the i2 by it's address
WITH i, head(collect(i2)) as i2 // <-- collect all of the matches and take the first
MERGE (i)-[r:USED_BY]->(i2)
RETURN i, i2, r
推荐阅读
- flutter - 如何让 url 启动器发送电子邮件?
- android - android-recycleView item on drop 没有使用 sqlite 正确排序
- consistency - etcd:强、线性和顺序一致性
- visual-studio-code - 如何关闭 VS Code 中的工具提示/建议?
- c# - 在linq c#中使用参数搜索查询
- gsub - 如何使用 gsub() 重命名 df 中的变量?
- javascript - 如何通过动态键对数组进行分组?
- node.js - 调用 Lambda 以向连接的 websocket 发送消息
- java - 如何使用 Smack 4 创建空 IQ 数据包
- python - Python3 Matplotlib psutil 脚本未运行