2017-07-26 86 views
2

翻译,我有以下数据模型:与ORDER的Cypher查询BY与后备

  • 节点实体BusinessObject
  • 节点实体Translation包含languagetext财产
  • 关系TRANSLATES从翻译到业务对象,可能有多个

翻译allo我要提供适合用户语言的文本。例如,用户可以阅读德语,业务对象翻译成英语和德语,然后用户界面显示德语。一般来说,用户的语言可以回退到默认语言(英语)。

现在,我想查询所有BusinessObject s,并通过翻译来排序它们,其中应该包括fallback。这甚至有可能与密码?

编辑:实例

BusinessObject的一个与翻译( “EN”, “某某英语翻译A”)和( “德”, “德意志Übersetzung毛皮”)。

BusinessObject B with Translations(“en”,“一些B的英文翻译”)和(“fr”,“Traductionfrançaispour B”)。

用户U1有语言德语(“de”),后退应该是英语(“en”)。因此,查询业务对象应该导致列表[A,B],因为当按升序排列时,按照字典顺序,翻译“Deutsch ... for A”位于“Some En ... for B”之前。另一方面,当第二个用户具有语言法语时,结果应该是[B,A],因为“Traduc ... pour B”在“XYZ Eng ... for A”之前。第三位英文用户U3应该得到结果[B,A],因为翻译“Some ... for B”在“XYZ ... for 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

你可以分享输入到这个,以及期望输出的例子,以及你迄今在查询中做出的任何尝试吗? – InverseFalcon

回答

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 

也许这是更接近你在找什么。

+0

我真的需要'ORDER BY'包括回退。 –

+0

@SteffenHarbich,我添加了一个编辑功能,可以完成我认为你正在寻找的功能。 –

+0

谢谢!查看我编辑的最终查询。 –

2

您可以使用OPTIONAL MATCH与coalesce做你想做的。

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

这只是返回字符串'英语'或英文翻译节点? –

+0

我想通过翻译来订购它,所以这并不适合我的问题。此外,这将返回语言而不是翻译。 –