微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在 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

免责声明:我尚未测试该查询。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。