如何在 Neo4J 中查询多个项目,return 按优先顺序只查询一个?
How to query multiple items in Neo4J, return just one in order of precedence?
我正在使用具有以下结构的 Neo4J 构建多语言应用程序:
(Article)-[:HAS_TRANSLATION]->(Translation {lang: 'EN', default: true, text: 'Hello World'})
我希望用户能够传递语言偏好列表,例如 ['EN', 'ES']
。查询应该 return 找到列表中第一种语言的翻译。如果未找到首选语言,则查询应 return 默认语言。应该只 returned.
一个翻译
很容易return列出所有适用的翻译。但这将在数百万个查询上浪费大量带宽。我也尝试输入 LIMIT 1
但结果顺序不正确。
MATCH (a:Article {id: '123'})-[:HAS_TRANSLATION]->(t:Translation)
WHERE t.lang IN ['ES', 'EN'] OR t.default = true
RETURN a, t
挑战在于 return 根据优先顺序正确翻译。
使用 UNWIND
,您可以将列表转换为保持列表顺序的行。
https://neo4j.com/docs/cypher-manual/4.2/clauses/unwind/
首先,获取默认翻译语言的文章。
然后,展开包含首选语言的列表。
接下来,寻找首选语言的翻译。如果没有这样的翻译,则 return 不会被 MATCH
编辑。这就是为什么需要 OPTIONAL MATCH
,如果没有匹配,它将是 NULL
。
最后,return 首选(如果有)或默认翻译的第一个结果。
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
免责声明:我还没有测试查询。
我正在使用具有以下结构的 Neo4J 构建多语言应用程序:
(Article)-[:HAS_TRANSLATION]->(Translation {lang: 'EN', default: true, text: 'Hello World'})
我希望用户能够传递语言偏好列表,例如 ['EN', 'ES']
。查询应该 return 找到列表中第一种语言的翻译。如果未找到首选语言,则查询应 return 默认语言。应该只 returned.
很容易return列出所有适用的翻译。但这将在数百万个查询上浪费大量带宽。我也尝试输入 LIMIT 1
但结果顺序不正确。
MATCH (a:Article {id: '123'})-[:HAS_TRANSLATION]->(t:Translation)
WHERE t.lang IN ['ES', 'EN'] OR t.default = true
RETURN a, t
挑战在于 return 根据优先顺序正确翻译。
使用 UNWIND
,您可以将列表转换为保持列表顺序的行。
https://neo4j.com/docs/cypher-manual/4.2/clauses/unwind/
首先,获取默认翻译语言的文章。
然后,展开包含首选语言的列表。
接下来,寻找首选语言的翻译。如果没有这样的翻译,则 return 不会被 MATCH
编辑。这就是为什么需要 OPTIONAL MATCH
,如果没有匹配,它将是 NULL
。
最后,return 首选(如果有)或默认翻译的第一个结果。
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
免责声明:我还没有测试查询。