我建议将原始标题移动到它自己的节点中,称之为MovieTitle。以这种方式“复杂化”您的模型实际上应该“简化”(或至少标准化)您的查询,因为您总是在一个地方查找电影标题(也适用于索引和搜索)。
您假设电影只有一个原始标题,而事实并非如此。韩日合拍电影至少会有两个原始标题。整个日本电影类型都会在电影院和VHS上发布不同的原始日语标题。
与原始标题的概念不同的是特定语言标题的概念。在不同的华语国家/地区发行的同一部电影将具有不同的中文标题,这些标题被认为对特定当地观众更具市场价值。
获取原始标题:
MATCH (c:Country)<-[HAS_NATIONALITY]-(m:Movie)-[HAS_TITLE]->(t:MovieTitle)-[HAS_NATIONALITY]->(c:Country)
WHERE m.id = 1
RETURN COLLECT(t.title, c.country_code)
获取中国的原始标题:
MATCH (m:Movie)-[HAS_TITLE]->(t:MovieTitle)-[HAS_NATIONALITY]->(c:Country)
WHERE c.country_code == "CN"
RETURN m, COLLECT(t.title, c.country_code)
获取所有语言的标题:
MATCH (m:Movie)-[HAS_TITLE]->(t:MovieTitle)-[HAS_NATIONALITY]->(c:Country)-[HAS_LANGUAGE]->(l:Language)
RETURN m, COLLECT(t.title, l.language_code)
获取所有中文标题:
MATCH (m:Movie)-[HAS_TITLE]->(t:MovieTitle)-[HAS_NATIONALITY]->(c:Country)-[HAS_LANGUAGE]->(l:Language)
WHERE l.language_code == "zh"
RETURN m, COLLECT(t.title, c.name)
我会将情节和类型分别放入它们自己的节点中。有人认为不同国家的电影有独特的类型,但如果西部片和武士剧都是时期剧的子类型,那么你希望在时期剧搜索中找到它们。
我仍然会有翻译节点的想法,但不要将其与你正在建模的领域混淆。它应该是与领域无关的,并且对于像“浪漫喜剧”这样的简单词语/短语,几乎应该是GraphAware在2025年发布的第三方图形插件。
获取特定电影的法语流派标题:
MATCH (m:Movie)-[HAS_GENRE*]->(g:Genre)-[HAS_TRANSLATION]->(t:Translation)-[HAS_LANGUAGE]->(l:Language)
WHERE m.id = 100 AND l.language_code = "fr"
RETURN COLLECT(t.translation)
获取所有浪漫喜剧:
MATCH (m:Movie)-[HAS_GENRE*]->(g:Genre)-[HAS_TRANSLATION]->(t:Translation)
WHERE t.translation = "comédie romantique"
RETURN m
与电影标题和流派不同,情节更加简单,因为你将电影的故事建模为一段文本而不是领域对象本身。也许以后你可以对情节文本进行文本分析,以找出主题、性别偏见等,并在图形中进行建模。
获取特定电影的法语剧情:
MATCH (m:电影)-[HAS_PLOT]->(p:剧情)-[HAS_LANGUAGE]->(l:语言)-[HAS_TRANSLATION]->(t:翻译)
WHERE m.id = 100 AND t.translation = "法语"
RETURN p.plot
(请将Cypher查询视为伪代码。我没有创建图形并测试它们。)
https://graph.facebook.com/4
和帖子的https://graph.facebook.com/293481
。 - Vinicius Tavares