2015-05-07 3 views
1

Независимо от того, как я его качаю, мне нужна какая-то функция, чтобы найти индекс элемента в массиве, поставляемом в качестве параметра..indexOf() эквивалент в Neo4j Cypher

Я пытаюсь просто обновить элементы в коллекции, основанные на индексе одного из их свойств в массиве, и был просматриванием Cypher документов в течение почти 2 часов ...

Было бы также приемлемо для заказа элементов по этому массиву, а затем запустите foreach в упорядоченном списке ...

+1

Как вы упомянули, вы можете отсортировать свой список с помощью 'WITH' и собрать его для своего foreach. Я думаю, что сортировать коллекцию другим способом невозможно. Если у вас создана коллекция, чем вы можете 'UNWIND', сортируйте ее с' ORDER BY' и снова 'COLLECT()' – Gondil

+0

Можете ли вы показать мне синтаксис? Не совсем уверен, что вы имеете в виду. – djvs

+1

у вас есть какой-то коллекции, например, 'person_col', чем вы будете делать' код ... '' С person_col' 'UNWIND person_col, как' лиц, является ORDER BY person.name asc' 'СБОР (человек) как person_col ' , и теперь у вас есть сортировка вашей коллекции, вы можете использовать foreach. Я не знаю, хотите ли вы чего-то подобного. – Gondil

ответ

0

Недавно у меня blogged about that. Вы можете использовать функцию reduce с массива на три элемента в качестве переменной состояния, содержащего

  • индекс высшей оккупации до сих пор
  • текущий индекс (так называемый номер итерации)
  • значение высшей оккупации до сих пор

в качестве примера, чтобы найти индекс максимального элемента в массиве:

RETURN reduce(x=[0,0,0], i IN [1,2,2,5,2,1] | 
    CASE WHEN i>x[2] THEN [x[1],x[1]+1,o] ELSE [x[0], x[1]+1,x[2]] END 
)[0] 
+0

Я пробовал ваш пост в блоге в ночь, когда я разместил это сообщение, он, похоже, не работал (ничего не возвращать), IIRC. – djvs

+0

Интересно, можете ли вы адаптировать свой код к первоначальному требованию? Он должен «установить» их с нулевым i, i + 1, в порядке поставляемого массива. Также FYI, я думаю, у вас есть опечатка в одном из разделов кода (я думаю, вы ошибаетесь «i» для «o» или что-то в этом роде). – djvs

+0

Вы правы насчет опечатки, хороший улов. –

1

После @ Стефана- Armbruster ответ и отличный блог, медленный, но простой index_of может быть сделано с:

reduce(x=[-1,0], i IN [1,2,7,5,21,5,1,435] | 
    CASE WHEN i = 21 THEN [x[1], x[1]+1] ELSE [x[0], x[1]+1] END 
)[0] 

reduce Здесь функция работает с массивом в два элемента: положение и текущий индекс. Если элемент в вашем массиве соответствует заданному условию, первый элемент приведенного массива будет заменен текущим индексом. Я привел пример на консоль neo4j http://console.neo4j.org/?id=34byv