通过消除与某个节点的关系来接收连接节点的子集

时间:2015-03-07 02:35:35

标签: neo4j cypher

最后几天我想在Neo4j中找出一些东西,但我仍然没有成功。情况:

enter image description here

您会看到一个蓝色节点(数据库中有许多节点,但这个节点有一个特定的ID),蓝色节点连接到橙色节点,橙色节点连接到绿色节点。绿色节点进一步连接到其他橙色节点。

现在,如果我可以获得所有未直接连接到蓝色节点的橙色节点(用方块标记),那将是非常好的。

我可以从每个绿色节点获取所有橙色节点,但我只希望节点没有连接到蓝色(我也希望节点直接连接到蓝色的另一个收集或其他方法,但这不是要实现的问题)。

我尝试了不同的方法,举例说明我尝试过的一件事:

MATCH (b:BLUE{BLUE_ID:'234234'})-[a:relation_type_1]->(node_with_connection_to_blue)<-[c:relation_type_2]-(g:GREEN)-[d:relation_type_2]->(node_with_no_connection_to_blue)<-[e:relation_type_1]-(b:BLUE)
WHERE NOT (node_with_no_connection_to_blue)<-[a:relation_type_1]-(b:BLUE{BLUE_ID:'234234'})

在任何帮助下,我将非常感激!提前谢谢!

祝你好运

1 个答案:

答案 0 :(得分:1)

有多种方法可以解决这个问题。假设蓝色节点没有直接连接到大量的橙色节点,我首先建立一个包含所有蓝色直接邻居的集合,然后在第二步中遍历到第二度的橙色节点。那些需要由WHERE中的直接邻居过滤:

MATCH (b:BLUE{BLUE_ID:'234234'})-[:relation_type_1]->(o)
WITH b, collect(o) as directNeighbors
MATCH (b)-[:relation_type_1]->()<-[:relation_type_2]-()-[:relation_type_2]->(orange)
WHERE NOT orange in directNeighbors
RETURN distinct orange