Идентификаторы узлов Neo4jClient

У меня возникли проблемы с тем, как работает идентификатор в Neo4jClient. Я хочу, чтобы моя модель .NET имела свойство идентификатора, и в идеале я бы хотел, чтобы он просто использовал автоматически увеличиваемый идентификатор Neo4j для этого узла.

Однако независимо от того, какой регистр я использую (id, ID, Id) в своем классе модели, он всегда добавляет это как другое поле в Neo4j (сохраняя его равным 0, когда я создаю новый узел). Поэтому, когда я просматриваю этот узел в браузере Neo4j, он имеет <id>, который автоматически увеличивается, а также мое поле id, которое всегда равно 0 (если только я не установил его вручную в своей модели на C#).

Я хочу иметь возможность создать новый класс модели .NET (который изначально будет иметь неинициализированный идентификатор 0), а затем, как только я создам его с помощью запроса Neo4j Fluent Cypher, он будет иметь идентификатор из вновь созданного узла с автоинкрементом Я БЫ.

Примеры здесь: https://github.com/Readify/Neo4jClient/wiki/cypher-examples

Покажите, что их User класс имеет такой идентификатор:

public long Id { get; set; }

Но в примере для создания нового пользователя...

var newUser = new User { Id = 456, Name = "Jim" };
graphClient.Cypher
    .Create("(user:User {newUser})")
    .WithParam("newUser", newUser)
    .ExecuteWithoutResults();

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


person Dan    schedule 01.11.2015    source источник


Ответы (2)


Алессандро прав, и вы не должны использовать Node ID, уж точно не в качестве сопоставлений с внутренними представлениями. Если вы удалите узел, а затем создадите другой, он вполне может иметь тот же идентификатор.

Теперь иногда вам нужно получить идентификатор (опять же не для использования в качестве внутреннего идентификатора), но, возможно, в результате пути или что-то в этом роде, и Neo4jClient делает позволить вам получить его.

Осторожно, так лгут драконы.

Neo4jClient - это все о POCO, это помогает вам переводить их в Neo4j и из него, пример из WIKI - это просто, например, идентификатор мог исходить из любого количества источников или быть любого типа, например, я довольно часто используйте GUID для моих идентификаторов. Точно так же я использовал такие вещи, как SnowMaker в прошлом для создания идентификаторов. Если вам нужен идентификатор узла, вам нужно обернуть POCO типом Node<T>, поэтому:

client.Cypher.Match("(n:User)").Return(n => n.As<User>()).Results;

получает ответ IEnumerable<User>, тогда как:

client.Cypher.Match("(n:User)").Return(n => n.As<Node<User>>()).Results;

получает ответ IEnumerable<Node<User>>, где каждый экземпляр Node<T> будет иметь свойство — Reference, которое является идентификатором Neo4j, а другое — Data, которое является битом T/POCO.

person Charlotte Skardon    schedule 01.11.2015
comment
Спасибо. Это хороший момент, когда новый узел имеет тот же идентификатор, что и удаленный. Внутренне я был бы счастлив использовать GUID, просто он выглядит немного запутанным, так как в конечном итоге окажется в URI. Имейте в виду, это тоже не идеально, если Neo4j ID появляется в uri! Тогда я подумаю о другом способе ссылки на конкретный узел. Это в основном для страницы «редактирования» на веб-сайте/приложении. - person Dan; 01.11.2015
comment
Если это на Azure, Snowmaker очень полезен и удобен для уникальных идентификаторов. - person Charlotte Skardon; 02.11.2015
comment
Спасибо, проверим. Он находится в Azure, но содержится в контейнерах Docker. - person Dan; 02.11.2015

использование id из Neo4j — неправильная практика, так как со временем он может измениться или быть назначен другому узлу. Взгляните на этот плагин:

https://github.com/graphaware/neo4j-uuid

Ваше здоровье,

person Alessandro Negro    schedule 01.11.2015
comment
кажется, его снято с производства. Для справки: graphaware.com/ framework/2021/05/06/ - person CdVr; 10.06.2021