2015-11-01 86 views
1

我在解決這個ID如何在Neo4jClient中工作時遇到了問題。我希望我的.NET模型有一個標識符屬性,理想情況下,我只想爲該節點使用Neo4j自動增量標識。Neo4jClient節點ID

然而,不管我用什麼樣的情況下(idIDId)在我的模型類,它總是會將此作爲Neo4j的另一場(保持它爲0,當我創建一個新的節點)。因此,當我在Neo4j瀏覽器中查看該節點時,它有一個<id>,它自動遞增,並且我的id字段始終爲0(除非我在C#中手動將其設置在我的模型中)。

我希望能夠創建一個新的.NET模型類(最初將有一個未初始化的ID爲0),然後一旦我用Neo4j流暢的Cypher查詢創建它,它將具有來自新創建的節點的自動增量ID。

這裏的例子: https://github.com/Readify/Neo4jClient/wiki/cypher-examples

展示自己User類有這樣的ID:

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

亞歷山德羅是正確的,你不應使用節點ID肯定不如映射到內部表示。如果你要刪除一個節點,然後創建另一個節點,它可能會有相同的ID。

現在,也有一些時候,你需要來獲取ID,(再次用作內部標識符) - 但也許在路徑結果什麼的,Neo4jClient不會讓你得到它。

被警告,這就是龍的謊言。

Neo4jClient是所有關於POCO的,它可以幫助你把它們翻譯成和的Neo4j,從WIKI的例子就是這樣,一個例子,ID可能來自任意數量的來源,或者是任何類型,例如,我經常使用GUID作爲我的ID。同樣,我在過去使用過像SnowMaker這樣的東西來生成ID。如果你想節點ID,你需要用你的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 ID和另一個 - Data這是T/POCO位。

+0

謝謝。這是關於具有與刪除的ID相同的新節點的好處。在內部,我會很高興使用一個GUID,它看起來有點混亂,因爲它會以URI結尾。請注意,它並不是Neo4j ID出現在uri上的理想選擇!我會想到另一種引用特定節點的方法。這基本上是一個網站/應用程序的「編輯」頁面。 – Dan

+1

如果它在Azure上,造雪者是非常有用和容易的唯一ID –

+0

謝謝,將檢查出來。它在Azure上,但包含在Docker容器中。 – Dan