2015-03-25 2 views
1

Итак, я пытаюсь написать ответ на вопрос this question, который мне показался интересным. Что, черт возьми, я сделаю это.Построение карты не позволяет индексировать коллекцию как ключ карты?

Вот решение, с которым я пришел. Мне кажется правильным, и он должен давать правильный результат, но вместо этого дает ошибку симулятора.

Итак, игра здесь состоит в том, чтобы взять две коллекции (буквы и цифры) и построить карту из них, которая отображает правильную букву справа, последовательно из двух коллекций.

Мое решение:

with [1,2,3] as nums, ['a', 'b', 'c'] as letters 
with nums, letters, range(0, length(nums)-1) as idxs 
return extract(idx in idxs | { letters[idx] : nums[idx] }); 

Мои рассуждения в том, что мне нужно перебирать индексы сбора, так что я могу использовать один и тот же показатель для «продвижения обеих коллекций» одновременно. Я использую extract, чтобы получить каждый индекс, а затем построить вложенную карту, которая соединяет соответствующие элементы.

Кроме того, что он не потому, что ничтожество говорит:

Invalid input '[': expected an identifier character, whitespace, '}' or ':' (line 3, column 39 (offset: 140)) 
"return extract(idx in idxs | { letters[idx] : nums[idx] });" 
            ^

UPDATE: cybersam ответил на первоначальный вопрос here и указал, что «это не может быть возможно динамически создавать ключи карты». Поэтому мой реальный вопрос - это то, что (карты не могут иметь динамические клавиши), и если да, то почему?

ответ

1

Это просто «ограничение» cypher. Вы можете попробовать это:

WITH 'a' as key, 'test' as value 
RETURN {key: value} 

но результат таков:

{"key":"test"} 

Правильный подход показан в ответе Cybersam. Что-то вроде этого:

WITH 'a' as key, 'test' as value, 'b' as key2, 'test2' as value2 
RETURN [{key: key, value: value}, {key: key2, value: value2}] 

будет результаты:

[{"key":"a","value":"test"},{"key":"b","value":"test2"}] 

Для создания динамических ключей карт вы должны использовать Java или других языков программирования.

+0

Зачем это было? Была ли эта конструкция «особенностью», где запрещены динамические клавиши, чтобы предотвратить худшую проблему, которая возникла бы, если бы были разрешены динамические клавиши? Или это был надзор? Или есть какое-то совершенно другое соображение, которое я пропускаю? – FrobberOfBits

+0

Я предполагаю/надеюсь, что есть какая-то интересная или глубокая причина, почему очевидная функциональность здесь не очень хорошая идея. Я согласен с тем, что обходной путь работоспособен, но это действительно kludgy. (Карта, в которой хранятся ключи и значения как значения! Это должно быть в словаре программирования прямо рядом с термином kludge) – FrobberOfBits

+1

Я согласен с вашими комментариями. Я думаю, что эта проблема имеет низкий приоритет, потому что есть обходные пути: 1) программирование языков 2) kludgy one; и реализация функциональности может быть сложной. Я думаю, что более высокий приоритет улучшает производительность, масштабируемость и т. Д. (Http://neo4j.com/whats-new-in-neo4j-2-2/) Мне нравится ждать следующих ответов и комментариев. –

Смежные вопросы