使用德语变音符号对查询结果进行排序

时间:2017-07-27 08:43:17

标签: neo4j cypher

是否有机会对包括ä,ö,ü等德语变音符号的密码查询结果进行排序?目前,我得到一个按字母顺序排序的列表,以变音符号开头的节点放在列表的末尾。通常它们应该在列表中,例如'Ö'应该等于'OE'。

感谢任何想法,谢谢。

2 个答案:

答案 0 :(得分:4)

由于您专门询问了Cypher,下面的查询是一个如何对声称字符进行排序的示例,就好像它们是连接的等价物一样(例如,将'Ü'视为'UE')。

WITH ['Dorfer', 'Dörfener'] AS names
UNWIND names AS name
RETURN name
ORDER BY
  REDUCE(s = name, x IN [
    ['ä', 'ae'], ['Ä', 'AE'],
    ['ö', 'oe'], ['Ö', 'OE'],
    ['ü', 'ue'], ['Ü', 'UE']] |
    REPLACE(s, x[0], x[1]));

上述查询将首先返回'Dörfener',然后返回'Dorfer'。

但是,上述方法效率不高,因为它为每个REPLACE调用name函数六次。在Java中编写user-defined procedure将整个names列表作为输入并在单个调用中返回已排序的列表会更有效。

答案 1 :(得分:1)

是的,您可以使用localeCompareIntl.Collator来实现此目的:

// Our original array
// Outputs ["u", "x", "ü", "ü", "ü"]
const input1 = ['ü','u','ü','x','ü'];
const output1 = input1.sort();
console.log(output1);

// Intl.Collator
// Outputs ["u", "ü", "ü", "ü", "x"]
const input2 = ['ü','u','ü','x','ü'];
const output2 = input2.sort(Intl.Collator().compare);
console.log(output2)

// localeCompare
// Outputs ["u", "ü", "ü", "ü", "x"]
const input3 = ['ü','u','ü','x','ü'];
const output3 = input3.sort(function (a, b) {
    return a.localeCompare(b);
});
console.log(output3)