2015-11-01 2 views
1

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

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

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

примеры здесь: 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 id, который я, очевидно, не знаю, пока он не создан.

ответ

4

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

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

Будьте предупреждены, таким образом, драконы лежат.

Neo4jClient все о ПОКО, это поможет вам перевести их и из Neo4j, пример из WIKI только что, пример, идентификатор может исходить из любого количества источников, или быть любого типа, для Например, я часто использую GUID s для своих идентификаторов. В равной степени я использовал такие вещи, как SnowMaker, чтобы генерировать идентификаторы.Если вы хотите, идентификатор узла, вам нужно обернуть ПОКО в 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.

+0

Спасибо. Это хороший момент, когда новый узел имеет тот же идентификатор, что и удаленный. Внутри, я был бы счастлив с помощью GUID, это просто выглядит немного грязно, поскольку это закончится на URI. Имейте в виду, что это не идеальный вариант, чем идентификатор Neo4j появляется на uri! Тогда я подумаю о другом способе ссылки на конкретный узел. Это в основном для страницы редактирования на веб-сайте/приложении. – Dan

+1

Если это на Azure, снеговик очень полезен и прост для уникальных идентификаторов –

+0

Спасибо, проверим. Он находится на Лазуре, но содержится в контейнерах Докера. – Dan

3

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

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

Приветствия,

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