neo4j - 获取不穿过某个节点的子图
问题描述
我有一个巨大的(非循环)图,并希望找到所有节点可通过X
给定节点的关系到达。但是,我不想越过具有特定属性的节点,{attr:'donotcross'}
因为这表示我不想越过的阻塞点(即,这是通向相邻子图的唯一节点)。
目前,我使用简单的 Cypher 查询进行广度优先搜索,以隔离相邻节点和 python,一旦到达该特定节点就停止递归。然而,这真的很慢,我认为使用纯 Cypher 来隔离这些节点可能会更快。
Cypher 查询看起来像什么通过 X 返回所有连接的节点但不遍历具有属性的节点attr:'donotcross'
?
我的直觉是
MATCH (n)-[:X*]->(inter)-[:X*]->(m) WHERE NOT inter.attr = 'donotcross' RETURN m
n 为起始节点。但是,这不起作用,因为如果在起始节点和目标节点之间存在多个禁止节点,则此模式可以将路径与禁止节点匹配。
解决方案
单独使用 Cypher,您可以使用以下方法:
MATCH path = (n)-[:X*]->(m) // best to use a label!
WHERE none(node in nodes(path) WHERE inter.attr = 'donotcross')
RETURN DISTINCT m
n
请记住,如果您无法通过特定标签的索引属性查找它们,则至少应该为起始节点使用标签。
另外,如果这些donotcross
节点相对较少,并且如果这些节点的标签上有索引attr
,那么首先在这些节点上匹配,收集它们,然后根据它进行过滤可能会更快:
MATCH (x) // best to use a label and index lookup!
WHERE x.attr = 'donotcross'
WITH collect(x) as excluded
MATCH path = (n)-[:X*]->(m) // best to use a label!
WHERE none(node in nodes(path) WHERE node in excluded)
RETURN DISTINCT m
推荐阅读
- javascript - 使用Nodejs + express登录注册,用户数据未定义
- azure - Azure ARM 部署槽 - 添加应用程序设置
- php - 插入俄语字符mysql
- javascript - 在 Set() 对象上反应 JSX 循环
- android - 错误:程序类型已经存在:android.support.v4.os.ResultReceiver?
- ios - 无法将“__NSCFString”类型的值转换为“NSArray”
- go - 将接口方法实现为指针接收器或值接收器的结构
- batch-file - 如何在 Inno Setup 中运行批处理文件,同时在每个命令执行时显示进度
- azure - 如何对开发团队创建的 Azure 分析服务进行 QA 测试
- java - 我的 RSA 解密不返回纯文本