如何在Neo4J中查询多个项目,按优先级顺序返回一个?



我正在使用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

免责声明:我还没有测试这个查询。

相关内容

  • 没有找到相关文章

最新更新