neo4j - Neo4j:强制节点唯一性,一对一匹配
问题描述
与我在下面所做的相比,是否有更优化的方法来确保查询图中的节点与获得的匹配中的节点之间的一对一关系?
例如,假设我想找到由唯一节点组成的长度为 4 的路径。我可以有这样的查询:
MATCH (n2)--(n1)--(n0)--(n3)--(n4)
return n0,n1,n2,n3,n4
但是,这并不能确保匹配的节点是不同的。例如,允许 n2 和 n4 匹配(这会给我一个循环)。我可以添加一个 where 子句“where not(n2=n4)”,但其他节点也可以匹配。似乎我需要为我想要唯一的所有节点对添加此子句,这在大型子图上很烦人。
有没有更好的方法来确保一对一的关系?
解决方案
使用路径变量并验证路径中节点的唯一性:
MATCH p = (n1)--(n2)--(n3)--(n4)--(n5)
// Enumerate all nodes in the path
WHERE ALL(n1 IN nodes(p) WHERE
// Each node must occur only once
size([n2 IN nodes(p) WHERE n1 = n2]) = 1
)
return n1, n2, n3, n4, n5
或者您可以使用该功能检查列表中的重复项APOC library
:
MATCH p = (n1)--(n2)--(n3)--(n4)--(n5)
WHERE apoc.coll.containsDuplicates(nodes(p)) = FALSE
return n1, n2, n3, n4, n5
推荐阅读
- java - @WithMockUser 在并行上下文中
- vue.js - 如何将 Vuetify 中所有项目的字体从 Roboto 更改为另一个
- php - 是否有任何辅助函数可以将表单数据分配到 laravel 中的模型中?
- node.js - 如何从对象数组中提取一系列对象并将它们重新插入到数组中的新位置?
- python - 如何使用列表理解方法获取“价格”序列化数据?
- css - 如何阻止侧边栏在引导管理主题中滚动
- java - 对于联系人列表的循环未执行
- amazon-web-services - 如何使用 Terraform 在两个不同的计划上触发 SSM 运行命令/文档
- c# - 是否可以在 ASP.NET Core 的 Identity RoleClaims 表中添加新列并获取所有列的值
- android - Android - 使用 Volley 解析嵌套的 JSON 数组