Я хочу знать, был ли список «А» уже отсортирован по его значениям (строго по возрастанию). Я подумал о том, чтобы сделать копию списка (=> «B») и сравнить его с «A», упорядоченным по его значениям (используя ASC). На данный момент я не знаю, как создать копию списка. Может, есть другой способ решить эту проблему проще (с помощью Cypher).

1
CB_Dev 16 Сен 2019 в 22:22

3 ответа

Лучший ответ

Если вы не хотите / не можете использовать APOC, вы можете отсортировать список с помощью

    UNWIND list as item
    WITH list,item ORDER BY item

Это немного неуклюже, потому что вам нужно перенести все нужные вам переменные во все операторы WITH.

Примере:

WITH [1,2,3,4] as list
UNWIND list as item
WITH list,item ORDER BY item
WITH list,collect(item) as sorted 
return list,sorted,list=sorted

Возвращается

╒═════════╤═════════╤═════════════╕
│"list"   │"sorted" │"list=sorted"│
╞═════════╪═════════╪═════════════╡
│[1,2,3,4]│[1,2,3,4]│true         │
└─────────┴─────────┴─────────────┘

Однако

WITH [1,2,3,1] as list
UNWIND list as item
WITH list,item ORDER BY item
WITH list,collect(item) as sorted 
return list,sorted,list=sorted

Возвращается

╒═════════╤═════════╤═════════════╕
│"list"   │"sorted" │"list=sorted"│
╞═════════╪═════════╪═════════════╡
│[1,2,3,1]│[1,1,2,3]│false        │
└─────────┴─────────┴─────────────┘

Или вы можете использовать функцию reduce, это позволяет избежать сортировки списка и выполнять итерацию по списку только один раз:

WITH [1,2,3,4] as list
WITH reduce(result = true, i in range(0,size(list)-2) | result AND list[i] <= list[i+1]) AS sorted
return sorted
0
František Hartman 16 Сен 2019 в 19:49

Вы можете напрямую протестировать оригинал list, что должно быть быстрее и использовать меньше ресурсов, чем выполнять новую сортировку и / или создавать копию списка.

Например, это вернет true:

WITH [1,2,3,4] AS list
RETURN ALL(i IN RANGE(1, SIZE(list)-1) WHERE list[i-1] <= list[i]) AS inOrder

И если list был [4,1,2,3], то вышеприведенный запрос вернул бы false.

1
cybersam 16 Сен 2019 в 21:41

есть функции сбора в процедурах APOC которые могут вам помочь, особенно apoc.coll.sort() и apoc.coll.sortNodes() в зависимости от того, являются ли они примитивными значениями или узлами.

Что касается создания копии списка, вы можете использовать понимание списка, чтобы выполнить проекцию элементов списка следующим образом:

WITH [1,2,3,4,5] as list1
WITH list1, [n in list1 | n] as list2
...

Что касается сравнения, сравнение на равенство между списками включает в себя упорядочение, поэтому для вышеизложенного RETURN list1 = list2 будет истинным, поскольку они содержат одинаковые элементы в одинаковом порядке. Но перетасовывание одного из списков выглядит так: RETURN list1 = apoc.coll.shuffle(list2) вернет false, поскольку порядок отличается.

0
InverseFalcon 16 Сен 2019 в 19:33