2012-01-29 49 views
50

Jestem nowy w Neo4j - właśnie zacząłem grać z nim wczoraj wieczorem.Identyfikatory węzła w neo4j

Zauważyłem, że wszystkie węzły są identyfikowane przez automatycznie zwiększaną liczbę całkowitą, która jest generowana podczas tworzenia węzła - czy tak jest zawsze?

Mój zestaw danych ma naturalne klucze strunowe, więc chciałbym uniknąć konieczności mapowania między identyfikatorami przypisanymi przez Neo4j a własnymi. Czy można zamiast tego używać identyfikatorów ciągów znaków?

Odpowiedz

64

Pomyśl o identyfikatorze węzła jako szczegółów implementacji (takich jak rowid relacyjnych baz danych, które mogą być używane do identyfikowania węzłów, ale nie należy się na nich powoływać, aby nigdy nie zostać ponownie użyte).

Dodajesz swoje naturalne klucze jako właściwości do węzła, a następnie indeksujesz swoje węzły za pomocą klucza naturalnego (lub włączasz dla nich automatyczne indeksowanie).

E..g w Java API:

Index<Node> idIndex = db.index().forNodes("identifiers"); 

Node n = db.createNode(); 
n.setProperty("id", "my-natural-key"); 
idIndex.add(n, "id",n.getProperty("id")); 

// later 
Node n = idIndex.get("id","my-natural-key").getSingle(); // node or null 

z auto-indekser chcesz włączyć automatyczne indeksowanie dla "id" pole.

// via configuration 
GraphDatabaseService db = new EmbeddedGraphDatabase("path/to/db", 
MapUtils.stringMap( 
    Config.NODE_KEYS_INDEXABLE, "id", Config.NODE_AUTO_INDEXING, "true")); 

// programmatic (not persistent) 
db.index().getNodeAutoIndexer().startAutoIndexingProperty("id"); 

// Nodes with property "id" will be automatically indexed at tx-commit 
Node n = db.createNode(); 
n.setProperty("id", "my-natural-key"); 

// Usage 
ReadableIndex<Node> autoIndex = db.index().getNodeAutoIndexer().getAutoIndex(); 
Node n = autoIndex.get("id","my-natural-key").getSingle(); 

Patrz: http://docs.neo4j.org/chunked/milestone/auto-indexing.html I: http://docs.neo4j.org/chunked/milestone/indexing.html

+8

Dzięki Michael, dokładnie to, co potrzebowałem wiedzieć. To oczywiście nie jest jeszcze mainstream, dokumentacja i dyskusja są bardzo lekkie! –

+2

@ Michael Głód, gdy zadzwonisz n.setProperty ("id", "mój-naturalny-klucz"); tworzysz inny identyfikator od automatycznie wygenerowanego węzła ide, który neo4j tworzy poprawne?Czy jest to próba zastąpienia identyfikatora używanego przez neo4j? –

+0

@ michael-hunger Czy można dodać właściwość auto-increment? Czy muszę tworzyć niepowtarzalne identyfikatory dla tworzonych węzłów? – satoru

0

To powinno pomóc:

Tworzenie indeksu do tyłu automatycznego indeksowania podczas importu partii Wiemy, że jeśli auto indeksowania jest włączony neo4j. właściwości, każdy utworzony węzeł zostanie dodany do indeksu o nazwie node_auto_index. Teraz, oto trochę fajniej. Jeśli dodamy oryginalny indeks ręczny (w czasie importu partii) i nazwijmy go jako node_auto_index i włączy indeksowanie auto w neo4j, wówczas węzły wstawione w grupie będą wyglądały tak, jakby były automatycznie indeksowane. A stamtąd na każdej chwili utworzyć węzeł, węzeł będą indeksowane, jak również **

. Źródło: Identifying nodes with Custom Keys

0

Poza wszystkimi odpowiedziami wciąż neo4j tworzy własne identyfikatory, aby działać szybciej i lepiej służyć. Upewnij się, że wewnętrzny system nie koliduje między identyfikatorami, a następnie utworzy węzły o tych samych właściwościach i wyświetli w systemie puste węzły.

1

Możliwe jest ustawienie unikalnych identyfikatorów dla węzłów/obiektów rzeczywistych w Neo4J. Możesz ustawić indeksowanie, ustawiając go w jednym z plików konfiguracyjnych.

Jest to wysoce zalecane, tzn. Wymyśl "naturalny" identyfikator dla węzłów i krawędzi, zamiast używania identyfikatora Neo4j seq. Pozwoli to zaoszczędzić Ci podróży w obie strony do db w dół linii. Tak właśnie robiłem w przeszłości.

Powiązane problemy