我有以下数据模型:
BusinessObject
Translation
和language
属性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;
当然,这并没有最好的表现,但对我来说没问题。感谢所有贡献者!
答案 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
也许这更接近你正在寻找的东西。