Neo4j:随机组合

时间:2017-03-10 07:30:39

标签: neo4j cypher

我正在尝试为两组人进行国际象棋比赛。我必须随机从每个小组中挑选一名成员并进行游戏。根据每个小组的胜利数量,我将决定哪个小组更有才华。

让我们说,Group1和Group2。 Group1包含40个人,Group2包含30个人。现在,我必须挑选两个人,每个人来自一个小组并进行游戏。

Game1 : P1G1----vs----P4G2
Game2 : P23G1----vs----P1G2
Game3 : P12G1----vs----P15G2
....
....
....
Game30: P36G1----vsP30G2

如何使用neo4j获得这些随机组合。基本上,我怎样才能避免使用Cartis产品。

随机选择(由@Micheal Hunger提供)

MATCH (n) WITH count(*) as total
WITH [_ IN range(1,10000) | toInt(rand()*total)] as ids
MATCH (per) WHERE id(per) IN ids AND emp:Group1
RETURN per

如何从每个组中获取随机组合?

2 个答案:

答案 0 :(得分:3)

APOC Procedures刚刚更新了一些可能有帮助的collection functions(确保您获得了Neo4j版本的正确APOC版本)

至少需要Neo4j 3.1.x和最新版本的APOC。

参见apoc.coll.randomItem()和apoc.coll.randomItems()。

有几种方法可以使用这些来解决您的问题,具体取决于所有玩家是否必须参与至少一个游戏,但这里有一个例子:

如果你不需要每个玩家参与游戏,你只需要30个游戏,你可以使用这些功能的组合来获得你的对战。

MATCH (g1:Group1)
WITH COLLECT(g1) as g1
MATCH (g2:Group2)
WITH g1, COLLECT(g2) as g2
UNWIND apoc.coll.randomItems(g1, 30) as group1
WITH group1, apoc.coll.randomItem(g2) as group2
RETURN group1, group2

答案 1 :(得分:1)

如果群组中的人数很少(例如,最多1000个),则可以按随机排序并限制:

MATCH (A:Group1),(B:Group2)
WHERE A <> B
RETURN A, B 
       ORDER BY RAND() 
       LIMIT 30