Hi,

Recently Johan pointed out to me that merging databases was not something
easily added to the core neo4j because there would be clashes of ids.
However, I have thought a bit more about it, and I think there is a way this
can work (in theory) for special cases.

Here is my example:

   - We have a main database that contains most data. Node Id's presumably
   increment from 1 and up as data is added.
   - We wish to bulk load data into this database while it is still active
   (not allowed by bulk load)
   - We instead bulk load into a completely new database, but one where the
   id's are set to start at a high number, set well above the current max-id of
   the main database
   - Once bulk load is finished, we new database is appended to the main one
   with no id clashes

Issues I can imagine with this approach:

   - We need to be sure the main database does not grow enough to create an
   id clash during the time of the bulk load. I would think the offset is
   something the application programmer needs to choose based on knowledge of
   the behaviour of the application in this regard. For example, if the only
   way the application adds large numbers of nodes is through the bulk load,
   the programmer knows the main ids will not grow as long as only one bulk
   load runs at a time. Worst case scenario, the merge is rejected and the
   application has to repeat the entire load with a new offset.
   - If id's are actually pure array indexes to the data, then current neo4j
   code would not support indexing from a high number. I would imagine it easy
   to have a database wide offset to deal with this.
   - If id's are array indexes, after the merge there would be a possibly
   large chunk of space in the database (after the end of the main data and
   before the beginning of the new data).
   - This trick is probably necessary for all database files, nodes,
   relationships and properties.
   - After the merge the application code needs all Node instances to still
   be valid, for both databases, but presumably the NeoService instance needs
   to be merged to point to one object. The application node should also take
   care to create appropriate links between old and new data, assuming that is
   needed by the application (it is in my case).

What do people think of this approach? If it is possible, it would certainly
solve my problem with needing to run bulk loads on a live database. I
personally do not think the additional API components would be too complex.
In fact all that is needed are three API additions:

   - Ability to get the current max node id from the main database (perhaps
   already exists?)
   - Ability to set the offset for the ids in the EmbeddedNeo() constructor
   - Method on NeoService (or probably only on EmbeddedNeo) for merging in
   another database, for example, mainNeo.append(tempNeo). This would
   presumably return a boolean, or throw exceptions. I expect the tempNeo
   instance becomes invalid after this call (or points to the same database as
   mainNeo). Node instances on either database need to remain valid (but point
   to the main database), so we can add relations immediately to link the
   datasets correctly.

Cheers, Craig
_______________________________________________
Neo mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user

Reply via email to