我有一个包含游戏中使用过的策略的数据库。
(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之间的所有关系?或者有更简单的方法吗?
答案 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]