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

Reply via email to