[NoSQL] Game Database


Basic Query
1.5点満点のゲームと点数をつける人を探します.
MATCH (u:User)-[r:PLAY]->(g:Game)
WHERE r.rating = 5
RETURN g, u
5点満点のゲーム「The Forest」「Don't Starve」「Stardew Valley」「BattleGround」「Dayby Daylight」
5点をあげる人:“Skunk”、“Frog”、“Giraffe”、“Pig”、“Dog”、“Fox”、“Turtle”
2.「Survival」タイプのゲームと、それをストリーミング処理するStreamを探します.
MATCH (s:Streamer)-[:STREAMING]->(g:Game)-[:HAS_GENRE]->(ge:Genre)
WHERE ge.name = “Survival”
RETURN s, g
「Survival」タイプのゲーム「Don't Starve」「TheForest」「DaybyDaylight」「BattleGround」
ストリーミングメディア:「Sky」「Wind」「Stone」「Moon」「Flower」「Star」「Sand」「Sun」
3.Stream「Ocean」ストリーミングゲームとそのゲームをプレイするプレイヤーを探します.
MATCH (u:User)-[:PLAY]->(g:Game), (s:Streamer{stagename:”Ocean”})
WHERE (s)-[:STREAMING]->(g)
RETURN u, g
Oceanストリーミングゲーム:「iRacing」「Football Manager」
プレイヤー:「Elephant」「Skunk」「Duck」
4.ゲーム「Battle Group」のプレイヤーとプレイヤーのゲーム時間は、ゲーム時間が大きい順に求める.
MATCH (u:User)-[r:PLAY]->(g:Game)
WHERE g.title=”Battle Ground”
RETURN u.name AS Users, r.playtime AS `Playtime of Battle Ground`
ORDER BY r.playtime DESC
5.「アドベンチャー」タイプのゲームで最も採点が良いゲームとそのゲームの平均点を求める.
MATCH (u:User)-[r:PLAY]->(g:Game)-[:HAS_GENRE]->(ge:Genre{name:"Adventure"})
WITH avg(r.rating) AS rate_average, g
RETURN g.title AS Game, rate_average
ORDER BY rate_average DESC
LIMIT 1
“Don’t Starve”, 4.5
Recommendation System
1.Turtleとの類似性が高い人を5人探して、点数の高いゲームをお勧めします
Turtleと同じゲームをしている人とTurtleの類似点を探します
MATCH (u1:User{name:"Turtle"})-[x:PLAY]->(g:Game)<-[y:PLAY]-(u2:User)
WITH SUM(x.rating*y.rating) AS xyDotProduct,
	SQRT(REDUCE(xDot=0.0, a IN COLLECT(x.rating)|xDot + a^2)) AS xLength,
    SQRT(REDUCE(yDot=0.0, b IN COLLECT(y.rating)|yDot + b^2)) AS yLength,
    u1, u2
MERGE (u1)-[s:SIMILARITY]-(u2)
SET s.similarity = xyDotProduct / (xLength * yLength)
RETURN s.similarity
Turtleと類似性の高い5人を検索
MATCH (u1:User{name:"Turtle"})-[s:SIMILARITY]-(u2:User)
WITH u2, s.similarity AS sim
ORDER BY sim DESC
LIMIT 5
RETURN u2.name AS Neighbor, sim AS Similarity
「Squirrel」、「Fox」、「Girffe」、「Skunk」、「Cat」と「Turtle」の類似性が高い.
「Turtle」には類似性の高い人に点数の高いゲームをおすすめします
MATCH (u:User)-[r:PLAY]->(g:Game), (u)-[s:SIMILARITY]-(fox:User{name:"Fox"})
WHERE NOT ((fox)-[:PLAY]->(g))
WITH g, s.similarity AS similarity, r.rating AS rating
ORDER BY g.title, similarity DESC
WITH g.title AS game, COLLECT(rating)[0..3] AS ratings
WITH game, REDUCE(s = 0, i IN ratings | s + i) AS reco
ORDER BY reco DESC
RETURN game AS Game, reco AS Recommandation
Turtleには、「Battle Group」、「Super Animal Royale」、「Stardew Valley」、「Footbal Manager」=「Rusty Lake」、「To The.Moon」の順にゲームをお勧めします
2.「Fox」で購読したStreamが一番多いゲーム順でおすすめ
MATCH (fox:User{name:"Fox"})-[r1:SUBSCRIBE]->(s:Streamer)-[r2:STREAMING]->(g:Game)
WHERE NOT ((fox)-[:PLAY]->(g))
WITH g, count(g) AS game_count
ORDER BY game_count DESC
RETURN g.title AS Game, game_count AS `Recommendation by Streamer`
Foxには「Battle Group」「Don't Starve」「Stardew Valley」の順に並んだゲームがおすすめです
3.「Frog」などのゲームをする人におすすめのゲームで、平均プレイ時間が最も高い
MATCH (u1:User)-[r:PLAY]->(g:Game), (frog:User{name:"Frog"})
WHERE NOT (frog)-[:PLAY]->(g)
RETURN g.title AS Game, avg(r.playtime) AS `Recommendation by Playtime`
ORDER BY avg(r.playtime) DESC
「注文欄」、「Football Manager」、「Stardew Valley」、「Super Animal Royale」、「To The Moon」、「Assphalt」、「iRacing」、「Rusty Lake」の順にゲームをお勧めします