我如何告诉密码不遵循某种关系/边缘?
E.g。我有:NODE
通过:NODE
关系与另一个:BUDDY
相关联。此外,每个:NODE
都与:STUFF
任意深度的:BUDDY
相关,任意边是{strong>非类型:NODE
。我现在想要添加从每个:STUFF
到其:STUFF
的快捷方式关系。但是,我不包含其:BUDDIES
的{{1}}。
(:NODE)-[:BUDDY]->(:NODE)
(:NODE)-[*]->(:STUFF)
我当前的查询如下所示:
MATCH (n:Node)-[*]->(s:STUFF) WHERE NOT (n)-[:BUDDY]->()-[*]->(s) CREATE (n)-[:HAS]->(s)
但是我对此查询存在一些问题:
1)如果我在:BUDDY
之间没有直接添加:NODE
关系,而:NODE
的子项之间的关系,则查询将使用该关系进行匹配。这可能不是我想要的,因为我根本不想包括好友。
2)解释告诉我neo4j匹配(:NODE)-[*]->(:STUFF)
然后AntiSemiApply
模式(n)-[:BUDDY]->()
。因此,它匹配整个图形,然后取消匹配大多数找到的连接。这似乎无效,查询运行速度比我喜欢的慢(但这听起来似乎主观)。
一个(不好)修复方法是通过(:NODE)-[*]->(:STUFF)
限制(:NODE)-[*..XX]->(:STUFF)
的深度。但是,除非我在最坏的情况下使用荒谬的高数字,否则我无法保证这种深度。
我实际上只是想告诉neo4j不遵循某种关系。例如。 MATCH (n:NODE)-[ALLBUT(:BUDDY)*]->(s:STUFF) CREATE (n)-[:HAS]->(s)
。如何在不必枚举所有允许的连接并将它们与|
连接的情况下实现这一点(这非常快 - 但我必须手动跟踪所有可能的关系)?
答案 0 :(得分:0)
此特定模式的一个选项是显式遍历BUDDY
关系所关注的点,然后从那里执行所有无限制的遍历。然后,您只需将过滤器应用于单步关系:
MATCH (n:Node) -[r]-> (leaf)
WHERE NOT type(r) = 'BUDDY'
WITH n, leaf
MATCH (leaf) -[*] -> (s:Stuff)
WITH n, COLLECT(DISTINCT leaf) AS leaves, COLLECT(DISTINCT s) AS stuff
RETURN n, [leaf IN leaves WHERE leaf:Stuff] + stuff AS stuffs
另一个选项是安装apoc
并查看路径扩展器过程,它允许您从路径查询中“黑名单”节点标签(例如:节点),这可能同样有效取决于你的图表。 See here.
答案 1 :(得分:0)
我的最终解决方案是从
的集合中生成一个字符串 {relations}\{relations_id_do_not_want}
并将其用于匹配。因为我正在使用API,因此可以自动完成这一代,它不像我担心的那么多,但仍然带来不便。但是,这是我发布此问题以来唯一能找到的解决方案。
答案 2 :(得分:-2)
您可以使用条件关系类型:
MATCH (:Node)-[r:REL]->(:OtherNode)
WHERE NOT type(r) = 'your_unwanted_rel_type'
我没有关于穿孔的线索