我正在使用Neo4J构建一个具有以下结构的多语言应用程序:
(Article)-[:HAS_TRANSLATION]->(Translation {lang: 'EN', default: true, text: 'Hello World'})
我希望用户能够传入语言首选项列表,如['EN', 'ES']
。查询应该返回找到的列表中第一个语言的翻译。如果没有找到首选语言,则查询应返回默认语言。只返回一个翻译。
很容易返回所有适用翻译的列表。但这将在数百万个查询上浪费大量带宽。我也试着放入一个LIMIT 1
,但结果不是在正确的顺序。
MATCH (a:Article {id: '123'})-[:HAS_TRANSLATION]->(t:Translation)
WHERE t.lang IN ['ES', 'EN'] OR t.default = true
RETURN a, t
难点在于根据优先级顺序返回正确的翻译。
使用UNWIND
,您可以将列表转换为保持列表顺序的行。
https://neo4j.com/docs/cypher-manual/4.2/clauses/unwind/
首先,获取具有默认翻译语言的文章。然后,用首选语言展开列表。接下来,寻找首选语言的翻译。如果没有这样的翻译,MATCH
将不会返回任何东西。这就是为什么需要OPTIONAL MATCH
,如果没有匹配,它将是NULL
。最后,返回第一个结果,使用首选(如果有的话)或默认翻译。
MATCH (a:Article {id: '123'})-[:HAS_TRANSLATION]->(default:Translation {default: true})
WITH a, default
UNWIND ['ES', 'EN'] AS lang
OPTIONAL MATCH (a)-[:HAS_TRANSLATION]->(t:Translation {lang: lang})
RETURN a, CASE WHEN t IS NULL THEN default ELSE t END AS t
LIMIT 1
免责声明:我还没有测试这个查询。