GraphGists

引言

在西雅图观看戏剧后,我开始对剧团、戏剧、演员、导演和工作人员之间的关系感到好奇。这个GraphGist开始探索其中一些数据,使用了西雅图莎士比亚剧团的演出历史。

模型

Model

  • 人物:代表一个人!在这个简化模型中按姓名区分,可能存在“创作”、“导演”等关系

  • 戏剧:代表一个剧本 - 一个人物创作了该戏剧,该戏剧可能在一次演出上演。属性可能包括创作年份、出版年份和类型。

  • 演出:代表给定戏剧的一次或一组表演。演出通常由某人导演,并可能包含指示开始和结束年份月份以及是否作为巡回演出或在公园演出的属性。

图可视化

查询

你能猜出哪部戏剧演出次数最多吗?

MATCH (prod:Production)-->(play:Play)<-[WROTE]-(w:Person)
WHERE w.name = "William Shakespeare"
RETURN play.name, count(prod.title) as n_productions
order by n_productions desc

《罗密欧与朱丽叶》已经演出了11次!这可能不令人意外,它名列榜首——让我们看看这些演出

看起来《罗密欧与朱丽叶》是一部可靠的巡回演出剧目。当我移除巡回演出和公园演出后,热门戏剧列表会如何变化?

MATCH (prod:Production)-->(play:Play)<-[WROTE]-(w:Person)
WHERE w.name = "William Shakespeare"
and (prod.onTour = False and prod.inParks = False)
RETURN play.name, count(prod.title) as n_productions
order by n_productions desc

对于莎士比亚戏剧,我也很好奇类型——喜剧和历史剧的演出频率如何?

MATCH (prod:Production)-->(play:Play)<-[WROTE]-(w:Person)
WHERE w.name = "William Shakespeare"
RETURN play.genre, count(prod.title) as n_productions
order by n_productions desc

西雅图莎士比亚剧团还没有演出过哪些莎士比亚戏剧?

MATCH (writer:Person)-[WROTE]->(play:Play)
WHERE writer.name = "William Shakespeare"
WITH play
MATCH (play)
WHERE NOT (play)<-[:STAGED]-()
RETURN play.name, play.genre

只有八部!

利用Neo4j灵活的数据模型

有些演出是“改编”、“构思”或“汇编”,而不是创作的——例如,《亨利四世》第一部和第二部合并成一场演出,多部莎士比亚戏剧的场景在一次演出中表演等——而Neo4j灵活的模式允许使用独特的关联标签来保留这些边缘情况

MATCH p=(person:Person)-[r]-(play:Play)
WHERE ANY(x in relationships(p) WHERE type(x) <> "WROTE")
AND ANY (x in relationships(p) WHERE type(x) <> "DIRECTED")
RETURN person.name, type(r), play.name;
© . All rights reserved.