GraphGists

JIiwHO1

我们将开发一个基于游戏《英雄联盟》的案例研究。《英雄联盟》是一款MOBA游戏(多人在线战术竞技游戏),玩家使用独特的角色(称为英雄)互相战斗。在这款游戏中,选择合适的英雄来对抗特定的敌人非常重要,并且购买最好的“武器”可以增加获胜的机会;我们的模型旨在轻松获得这些有用的信息,帮助玩家在游戏开始之前做出决定。这些武器被称为道具,我们将其创建为节点,玩家在一个英雄身上购买的一组武器被称为出装,它们也是节点。一个英雄如果弱于另一个英雄,就会被那个英雄克制,我们说他被克制了,我们将其保存为一种关系。

MATCH (n)
RETURN n
G1jtIJL

因此,您准备选择您的英雄,敌人已经选择了泽拉斯,魔法起源;您遇到了难题,该怎么办?

询问NEO4J!

“魔镜魔镜告诉我,谁是世界上最美丽的人?”

等等……“neo,给我泽拉斯等级1的前3名克制英雄”

MATCH (enemy:Champion)-[c:HAS_COUNTER]->(pick:Champion)
WHERE c.level = 1 AND enemy.name = 'Xerath'
RETURN pick.name as Pick
LIMIT 3

这些都是泽拉斯等级1的前三名克制英雄

(等级反映了HAS_COUNTER关系的相关性)

“我喜欢玩菲兹”

我应该选择哪些技能?

neo,给我菲兹最常用的前2个技能

MATCH (myPick:Champion)-[c:HAS_POPULAR_SPELL]->(spell:Spell)
WHERE myPick.name = 'Fizz'
RETURN spell.name as Spell
LIMIT 2

现在我正在玩菲兹,但我不知道我应该购买哪些最好的道具?

这次我知道“Faker”,英雄联盟中最顶尖的玩家之一,肯定玩过这个英雄,所以试试用一个特定的查询:“Neo,给我Faker最近为菲兹做的出装中购买的道具”(我们将出装名称保存为DateTIMESTAMP,这样我们就可以按名称排序并获取最新出装。应该由软件完成,为了通过Cypher获取最新道具,我们也为出装添加了毫秒级日期作为属性)

MATCH (myPick:Champion)-[c:HAS_BUILD]->(build:ChampionBuild)-[:HAS_ITEM]->(item:Item),(build:ChampionBuild)-[:DONE_BY]->(p:Player)
WHERE myPick.name = 'Fizz' AND p.name = 'Faker'
WITH max(build.milliseconds) AS maxDate
MATCH (myPick:Champion)-[c:HAS_BUILD]->(build:ChampionBuild)-[:HAS_ITEM]->(item:Item),(build:ChampionBuild)-[:DONE_BY]->(p:Player)
WHERE myPick.name = 'Fizz' AND p.name = 'Faker' AND build.milliseconds = maxDate
RETURN item.name AS item
h0vTlGa

统计信息

获取“xPeke”玩过的所有英雄

MATCH (champions:Champion)-[c:HAS_BUILD]->(build:ChampionBuild)-[:DONE_BY]->(p:Player)
WHERE p.name = 'xPeke'
RETURN DISTINCT champions.name as ChampionName

获取所有英雄中最受欢迎的技能

MATCH (champions:Champion)-[c:HAS_POPULAR_SPELL]->(spell:Spell)
RETURN spell.name as SpellName, count(spell.name) AS SpellCount
ORDER BY SpellCount DESC
LIMIT 1

获取英雄“菲兹”所有出装中最常用的技能

MATCH (champions:Champion)-[c:HAS_BUILD]->(build:ChampionBuild)-[:HAS_SPELL]->(spell:Spell)
WHERE champions.name = 'Fizz'
RETURN spell.name AS SpellName, count(spell.name) AS SpellCount
ORDER BY SpellCount DESC
LIMIT 1