遵循所有关系,但具体的关系

时间:2016-10-14 13:09:02

标签: neo4j cypher

我如何告诉密码不遵循某种关系/边缘?

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)。如何在不必枚举所有允许的连接并将它们与|连接的情况下实现这一点(这非常快 - 但我必须手动跟踪所有可能的关系)?

3 个答案:

答案 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'

我没有关于穿孔的线索