Craig, I like the tag tree idea. Quite flexible indeed.
Thanks! --- Yaniv On Thu, Nov 25, 2010 at 1:59 PM, Craig Taverner <cr...@amanzi.com> wrote: > Another factor to consider is multiple inheritance, where you are grouping > the people into overlapping groups. For example, you can have the > users/non.users split, but also perhaps a man/woman split, and this results > in four types. If you are concerned about having to restructure the graph > when adding new types, then I would suggest using a tag approach. This > means > you forget about inheritance, keep all person nodes directly under people, > and add tags to the person as and when you need to. > > There are two ways to add a tag: > > - Have a ref->tags->tag tree along side your ref->people->person tree, > and then you can cross link individual tag nodes to person nodes as an > when > you want. This is very dynamic and easy to maintain. If your GUI allows > users to add tags, you can support that also, by adding missing tags if > needed. > - Use lucene, by adding a tags string property to the person and indexing > that. This allows for free-form tagging, but does make the whole thing > less > definitive. > > My preference, as usual with such things, is to build a graph for it :-) > (ie. the tag tree). > > On Thu, Nov 25, 2010 at 12:49 PM, Yaniv Ben Yosef <yani...@gmail.com> > wrote: > > > Hi, > > > > I'm looking for best practices in modeling inheritance in Neo4J. > > Suppose I have a Person class. In the DB I naturally have a node for each > > person. I'm following the design guide, and created a PEOPLE subreference > > node, connected to all "Person" nodes (A and B in the diagram below) > > > > +---> A > > | > > REF --> PEOPLE --+ > > | > > +---> B > > > > Now suppose I introduce a User class, that extends Person. I thought > about > > a > > couple of options: > > 1. I could just connect the user nodes to the PEOPLE node, but then it > > would > > be more difficult to traverse only users. > > > > 2. Adding another "layer" of sub-referencing" > > > > > > +---> USERS ----+--> C > > | | > > REF --> PEOPLE --+ +--> D > > | > > +---> NONUSERS -+--> A > > | > > +--> B > > > > So there's the "USERS" node that is connected to all user nodes, and a > > "NONUSERS" node that is connected to all of the concrete Person nodes. > > This way the Person and User factories handle the connections to each > > subreference node. > > The downside of this is that as I introduce more types in the class > > hierarchy I need to start rewiring everything, which can be quite tedious > > at > > present and very costly in the long run. > > > > 3. Perhaps a better way is to avoid the NONUSERS node, keep the concrete > > People (A and B in this example) connected to the PEOPLE node [Option2]: > > > > +---> USERS ----+--> C > > | | > > REF --> PEOPLE --+ +--> D > > | > > +---------------+--> A > > | > > +--> B > > > > > > Of course, I'd use different relationship types so I can tell between > > people > > and and subreferences connected to PEOPLE. > > > > I'm sure these aren't the only ways, and there may be different ways to > > handle different cases. > > In any event, I'd appreciate your feedback, as well as any additional > tips > > related to inheritance. Also, if there's any Neo4J guide for managing > > inheritance that I missed, it would be great if someone would point me > out > > to it. > > > > Thanks, > > --- Yaniv > > _______________________________________________ > > Neo4j mailing list > > User@lists.neo4j.org > > https://lists.neo4j.org/mailman/listinfo/user > > > _______________________________________________ > Neo4j mailing list > User@lists.neo4j.org > https://lists.neo4j.org/mailman/listinfo/user > _______________________________________________ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user