图形数据库 - 如何处理多语言数据

6

我正在尝试使用多语言图形数据库,但我不知道如何实现最佳模型。

我的当前提议是创建两种节点类型:电影电影翻译

电影保存所有关系,如喜欢相关评分评论电影翻译包含所有可翻译的数据(标题情节流派)。 电影节点不包含这些属性,只有原始标题

电影电影翻译通过翻译关系相互绑定。

当我查询节点时,我会检查它们是否与查询的区域设置(例如en_US)具有翻译关系。 如果为真,则将翻译与主节点合并为结果。

我认为这种方式可能不是最好的,但我想不出更好的方法。

你们有更好的数据库模型建议吗?非常感谢。

如果你需要这个信息,我正在使用neo4j。

谢谢, Vinicius。

2个回答

3

我建议将原始标题移动到它自己的节点中,称之为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查询视为伪代码。我没有创建图形并测试它们。)


你好,Stephen!对于回答迟迟未到,我感到很抱歉。SO没有提醒我有您的回复。非常感谢你提供的深入见解,这太棒了。我没有考虑到同一部电影可能会有多个“original_title”。不过,我的处理方法是查询翻译时与节点无关。所以,如果我决定创建一个TVShow节点,Cypher也将保持不变。我的目标是模拟类似于Facebook图形API的东西,它有一个单一的端点用于所有节点,例如Mark节点的 https://graph.facebook.com/4 和帖子的 https://graph.facebook.com/293481 - Vinicius Tavares
也许我可以获取主查询节点标签,然后基于此在第二个查询中查询与其关联的所有元数据。你觉得呢? - Vinicius Tavares

1

我认为模型还可以。

你可以使用RETURN 电影,翻译RETURN {movie:电影,translation:翻译}

目前将节点转换为映射并合并这些映射还不受支持,这是路线图上的事项。

您希望在何处以及如何使用这些节点?如果用于渲染,您只需访问这两列或条目。如果用于图形可视化,您还可以将它们组合成json源中的一个节点。


谢谢你的回答 Michael。我只是害怕涉及到非常复杂的读写查询。而且,我需要深思熟虑我的 API 应该如何表现,以尽可能地避免最小化重复信息,因为这些多语言内容将由用户生成。也许可以基于接近度对现有电影标题进行 Lucene 查询,以考虑错别字。 - Vinicius Tavares

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接