These topics are fairly integral to what we do in ThingWorx, so I can share some feedback:
In our world "what goes where" isn't always determined by us - there are zillions of legacy data stores that might need to be integrated. They could be relational, proprietary, or accessed via some type of API or service invocation. Thus, our application needs to elastic enough to leverage those sources as well. In our case, we've chosen to create an abstraction layer for datasets, services, and events that allows us to manage this complexity and to create heterogeneous views/services/applications from that complexity. In terms of data we "can" control, we've chosen (for now) to put it all into Neo. This includes our modeling/metamodel (data, scripts/logic, visualizations, services, domain data types, etc.) as well as the data we collect (which is basically in two main forms: activity streams and "tables"). We've implementing an in-memory data transformation engine that allows us to do "sql-like" things (filter, sort, aggregate, join, etc.) on data from any of the aforementioned sources, as well as for data from our own domain objects (which uses the same dataset abstraction that we apply to external data). In terms of transactions, at this point, we have not yet going as far as implementing hybrid transactions that wrap both external (JDBC) transactions and Neo transactions. However, we have abstracted the way things get "invoked" such that it would be easy to place a single transaction wrapper around anything that might potentially manipulate data (in fact, it's implemented today but only for Neo transactions). I'm not sure what you mean in terms of "message queues for data distribution", but we use queues in two main ways within ThingWorx. First, we use "writer" queues to manage writing of stream entries and data table entries into Neo, since these will tend to be very high frequency/high volume writes and we didn't want to have to create a separate transaction for each of them. We use a set of workers that flush writes after each "X" seconds have elapsed or when "Y" records are waiting to be written. There are persistence helpers that know how to persist the various types of domain objects that get queued up. The other place we use them is for distribution of "events". These could be from internal or external sources, as a result of data mutation, user interaction, service invocation, timer, etc...we use queues as a means of regulating the flow/loading and to manage distribution/subscriptions. In terms of data migration strategies, that's an area where we're currently doing some exploration. We already have some basic "stuff" to take structures from RDBMS tables and turn them into their equivalent structures (and metamodel structures) in our platform and therefore in Neo, but we haven't really done much with it yet nor have we done much with things like indexes and constraints. Just simple data for now. What we are also exploring is using Neo to "index" data that might reside in external tables. The searchable view of the data would reside in Neo and we would maintain a reference back to the original source (table/row/unique identifier in that row) when we need to retrieve the original data. Sort of a spidering/crawling approach for now, though we would like it to also be event driven at some point. In terms of "features" that could help in the context of the questions you've asked, I suppose a few things come to mind: - The ability to enlist/contain a Neo transaction into other transactions (and vice versa, I suppose) - Richer data typing beyond the primitives that Neo stores today (DateTime and Location being a few interesting and common ones). Ideally this could be extensible. Currently, we use the domain object's metadata to help with this, which works OK - Special treatment for storing/retrieving large strings or blobs (perhaps even at the expense of performance on these activities, but indirectly improving performance on node/relationship/property reads/writes due to reduced memory consumption) - Support for "structured" storage (e.g. a property that represents a structure rather than a primitive). Using stuff like serialization is too fragile and platform/language-specific, but perhaps with some type of minimalist metamodeling/schemas this could be accomplished fairly easily (or some type of generic persistent model that knew how to deal with JSON objects, XML documents, native Java objects, Maps/Sets, etc.). This is all stuff that we've had to write on our own - Support for the idea of "node types" (similar to relationship types). Currently, we stamp each node with a String property that indicates its "type". Strings are not the most efficient way to do it, as we all know. Rick -------- Original Message -------- Subject: [SPAM] [Neo4j] Cats and Dogs, living together From: Andreas Kollegger <[1][email protected]> Date: Wed, December 01, 2010 12:52 pm To: Neo4j user discussions <[2][email protected]> Would anybody be willing to share experiences with trying to introduce Neo4j into a system with another relational (or other NoSQL) database? We're starting to think about best practices for integration: * Hybrid data-modeling: what goes where? * XA transactions * message queues for data distribution * data migration strategies Any problems or feature-requests related to living in a multi-storage-platform world are welcome. Cheers, Andreas _______________________________________________ Neo4j mailing list [3][email protected] [4]https://lists.neo4j.org/mailman/listinfo/user References 1. mailto:[email protected] 2. mailto:[email protected] 3. mailto:[email protected] 4. https://lists.neo4j.org/mailman/listinfo/user _______________________________________________ Neo4j mailing list [email protected] https://lists.neo4j.org/mailman/listinfo/user

