2015-12-23 1 views
0

мне нужно возвращать узлы вместе с их идентификаторами, и такие вещи, как это следует избегать:Узел возврата с неизвестной структурой запроса-времени с добавленным «вычисленным» свойством?

RETURN n, ID(n) as n_ID 

я бы очень предпочел, чтобы иметь возможность вернуть ID в «вычисленный» собственностью узел, так что клиент видит узел , как будто имеет свойство с именем id.

Я уже несколько часов ломаю голову над этим. Ближайший я нашел this comment under an unsatisfying answer to a similar question:

MATCH (n:Person) RETURN { id: ID(n), name: n.name } as user 

Этот метод бесполезен, поскольку он требует вручную реконструкции узла в качестве карты буквального в пункте RETURN. Это невозможно, если вы не знаете все имена свойств, которые будут типичным сценарием в моем приложении; плюс, может быть лотов свойств.

Следующее, что я пробовал, было оператором «+». Он выбрасывает несоответствие типа; вы не можете комбинировать карту с узлом таким образом. Я не могу найти какой-либо документированный способ конвертировать узел в карту. В документах упоминается KEYS(), но нет VALUES(), а также способ «закрепить» ключи и значения на карте.

Другое дело, я думал о попытке:

REDUCE(theMap = {id: ID(n)}, k in KEYS(n) | theMap + { what? : what? }) 

... но я не знаю ни как сделать «ключ переменной» в массиве буквальном, ни как доступ к свойству узла-переменным ключом.

Я пытаюсь сделать все возможное в cypher?

ответ

0

Вы можете добавить собственность id сразу после того, как вы установили CREATE узел (и в той же транзакции). Например:

CREATE (n:Person {name: "Fred", address: "123 Main St"}) 
SET n.id = ID(n) 
RETURN n; 

Таким образом, ваши узлы будут на самом деле имеют id узел - нет необходимости вычислять его позже.

+0

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

0

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

Существует плагин here, который может автоматизировать создание UUID и обсуждение Github here.

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