Cypher使用ORDER BY查询有关回退的翻译

时间:2017-07-26 06:27:39

标签: neo4j internationalization cypher

我有以下数据模型:

  • 节点实体BusinessObject
  • 包含Translationlanguage属性
  • 的节点实体text
  • 从翻译到业务对象的关系TRANSLATES,可能是多个

翻译允许我提供适合用户语言的文本。例如,用户能够阅读德语,业务对象被翻译成英语和德语,然后UI显示德语。通常,从用户的语言回退到默认语言(英语)。

现在,我想查询所有BusinessObject并按翻译排序,其中应包括回退。这对密塞塞来说甚至可能吗?

编辑:示例

带有翻译的BusinessObject A (“en”,“用于A的XYZ英文翻译”)和(“de”,“DeutscheÜbersetzungfürA”)。

带有翻译的BusinessObject B (“en”,“B的一些英文翻译”)和(“fr”,“TraductionfrançaispourB”)。

用户 U1 的语言为德语(“de”),后备应为英语(“en”)。因此,查询业务对象应该会产生列表[ A B ],因为翻译“Deutsch ...fürA”在“Some En ... for B”之前订购升序时按字典顺序排列。另一方面,当第二个用户 U2 具有法语时,结果应为[ B A ],因为“Traduc ...倾倒B“在之前”XYZ Eng ...为A“。第三个英语用户 U3 应该得到结果[ B A ],因为翻译“Some ... for B”在“XYZ ..之前”。 。对于A“。

所以如果可能的话,我真的需要数据库完成的订购。

编辑:解决方案

根据答案中的好主意,我提出了以下问题:

MATCH (r:BusinessObject)
WITH r
OPTIONAL MATCH (r)<-[TRANSLATES]-(t:Translation)
WHERE t.language = 'de' // user language
WITH r, t.text as t1
OPTIONAL MATCH (r)<-[TRANSLATES]-(t:Translation)
WHERE t.language = 'en' // fallback
WITH r, coalesce(t1, t.text) as sort
RETURN DISTINCT r ORDER BY sort;

当然,这并没有最好的表现,但对我来说没问题。感谢所有贡献者!

2 个答案:

答案 0 :(得分:2)

您可以使用OPTIONAL MATCH合并来做您想做的事。

MATCH (b:BusinessObject)
OPTIONAL MATCH (b)-[:TRANSLATES]-(t:Translation)
RETURN coalesce(t.language,'English')

答案 1 :(得分:2)

我不知道如何设置ORDER BY。但如果它存在的话,如果没有找到答案,另一种选择可能就是单独给你回退。

WITH "English" as fallback 
MATCH (b: BusinessObject)-[:TRANSLATES]-(FBTr: Translation)
WHERE Translation.language = fallback
WITH fallback, FBTr, b
MATCH (b)-[:TRANSLATES]-(tr: Translation)
WHERE Translation.language <> fallback
RETURN collect(tr) as Translations, FBTr as Fallback

修改
这是一个更简单的想法,按语言排序,将后退放在最后:

WITH 'English' as Fallback
MATCH (b:BusinessObject)-[:TRANSLATES]-(t)
WITH t, CASE t.language 
   WHEN Fallback THEN -1
   ELSE 0
END as sort
RETURN t ORDER by sort DESC, t.language

也许这更接近你正在寻找的东西。