查找具有相同关系的所有节点

时间:2015-05-26 11:38:30

标签: neo4j cypher graph-databases nosql

我有一个包含游戏中使用过的策略的数据库。

(strategy_1:Human) - [:BEATS] -> (strategy_1:Alien)
(strategy_2:Human) - [:BEATS] -> (strategy_1:Alien)
(strategy_3:Human) - [:LOSES] -> (strategy_1:Alien)
(strategy_4:Human) - [:DRAWS] -> (strategy_1:Alien)

(strategy_1:Human) - [:LOSES] -> (strategy_2:Alien)
(strategy_2:Human) - [:LOSES] -> (strategy_2:Alien)
(strategy_3:Human) - [:LOSES] -> (strategy_2:Alien)
(strategy_4:Human) - [:DRAWS] -> (strategy_2:Alien)

因此,人类的策略可能会对外星人的战略产生影响,制造或失败。我试图找到所有具有相同关系的策略,所以BEAT,DRAW或LOSE对抗相同的Alien策略。

在示例中,它将是strategy_1和strategy_2。现在我走这条路:

MATCH (strategyA:Human)-[r1]->(strategyB:Alien)<-[r2]-(strategyC:Human)
WHERE type(r1) = type(r2) AND NOT strategyA = strategyC 
RETURN strategyA

但这当然只会给我所有至少有一个匹配关系的策略。我现在怎样才能测试策略A和策略C之间的所有关系?或者有更简单的方法吗?

1 个答案:

答案 0 :(得分:1)

如果你想收集与给定关系类型的外星人策略相关的所有人类策略,你可以这样做:

MATCH (alien_strategy:Alien)
OPTIONAL MATCH (alien_strategy)<-[rel]-(human_strategy:Human)
RETURN alien_strategy, type(rel), collect(DISTINCT human_strategy)

这将列出外来战略和关系类型的每种组合的所有外来策略,关系类型和收集的人类策略列表。

按照您的示例,结果如下所示:

strategy_1:alien, BEATS, [strategy_1:Human, strategy_2:Human]
strategy_2:alien, LOSES, [strategy_1:Human, strategy_2:Human, strategy_2:Human]