2015-05-26 78 views
0

我有一個數據庫,其中包含遊戲中使用的策略。查找所有等價關係的節點

(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都是針對相同的外星人策略。

在示例中,它將是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

如果你想收集鏈接到一個陌生的戰略與給定的關係類型的所有的人的策略,你可以簡單地做:

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] 
+0

嘿,那已經很酷,但不正是我所期待的。我試圖找到所有相互平等的人類戰略,贏得,失敗和吸取相同的外來戰略。 – Philiiiiiipp

相關問題