Associating nodes with a type node is a good approach, especially if you want to be able to do queries like "give me all nodes of type X". But for knowing the semantic type of a node when found through a general traversal I prefer to use the navigational context of the node. For example if I have a Person-node I know that the node at the other end of a FRIEND-relationship will be a Person-node as well. Or if I have i Car-node I know that the node at the other end of a OWNER-relationship will be either a Person or a Company, both of which probably have enough in common for me to be able to get an address (for sending them the parking ticket or what ever), if I need to specifically know if it's a Person or a Company, I could use some property for that information (or check the relationship to a type node), but most of the semantic information would be known from how I reached the node.
I have added a note about this to the FAQ in the wiki. Cheers, Tobias On Tue, Dec 8, 2009 at 10:22 PM, Rick Bullotta < rick.bullo...@burningskysoftware.com> wrote: > Thanks, Peter. Good info. I think we ended up with a hybrid approach: we > modeled a set of "Type" nodes (related to a master "Types" node), each of > which includes the type metadata (property/type data) for a specific > "type". > "Instance" nodes then maintain a two-way relationship with their associated > "Type" node so that any node can quickly obtain its Type node and so we can > easily traverse all instances of a specific type...and we may end up > extending this such that the properties themselves are each a node of their > own, in some cases, where we need to be able to relate/search/traverse at a > very detailed level. I suppose that depends on the performance > implications > of having lots more nodes and relationships. > > In any case, it definitely seems "do-able" with Neo. > > > > > -----Original Message----- > From: user-boun...@lists.neo4j.org [mailto:user-boun...@lists.neo4j.org] > On > Behalf Of Peter Neubauer > Sent: Tuesday, December 08, 2009 3:25 PM > To: Neo user discussions > Subject: Re: [Neo] Type metadata in properties/nodes > > Hi Rick, > there are a number of interesting approaches to this, involving both > ways to retain the metadata: > > 1. RDF and OWL > - basically, every node will maintain a relationship to its type node > (your shadow node), something like x?--RDF:TYPE-->type_node which > contains info on what the type is, what properties etc. > > 2. Neo4j Meta package (http://components.neo4j.org/neo-meta/) > - this is the concept of describing the type of things in code (Java > in this case) and thus in code enforce the restrictions and type > conversions on properties through the code. This does not capture any > meta info in the graph but is easy to do. > > 3. Annotate the nodes with type info > - in this approach, there is a "type" or "classname" property on any > node that is used to derive the type to deserialize/serialize the > object into, the rest of the meta info is contained in the upper code > layers. Andreas Ronges JRuby bindings are using this approach. > > 4. Encode everything into a String property > - this approach means shuffling everything into a string property, > basically treating properties as BLOBs. Works in some cases, but > certainly locks down your data in these properties. > > What is best depends on your domain, and there might be more > approaches out there. I sense that you are asking even for an > extensible type system especially on properties. That is not in scope > of the core graph engine, but I am not sure if in theory it would be > possible to extend the property type system, we would need to discuss > that separately. > > Cheers, > > /peter neubauer > > COO and Sales, Neo Technology > > GTalk: neubauer.peter > Skype peter.neubauer > Phone +46 704 106975 > LinkedIn http://www.linkedin.com/in/neubauer > Twitter http://twitter.com/peterneubauer > > http://www.neo4j.org - Relationships count. > http://gremlin.tinkerpop.com - PageRank in 2 lines of code. > > > > On Tue, Dec 8, 2009 at 8:43 PM, Rick Bullotta > <rick.bullo...@burningskysoftware.com> wrote: > > I can see how relationships could be used to map "is a duck." typing, but > > I'm struggling with how to infer type from properties. In particular, > while > > anything could be stuffed into a String, it loses important semantics > when > > you do so. I'm not referring to *storage* as a String, which makes > plenty > > of sense - it's that the type identity of the source property is lost if > you > > do so. I could maintain a "shadow node" of the type metadata that could > be > > related to each instance with a property name/property type array, but > that > > seems like something that would be useful within the node model itself. > > > > > > > > Types like DateTime, hyperlinks, and so on, while quite easily storable > in > > Neo4J, lose useful semantics on the way in. I'd welcome your thoughts on > > how others have managed this type of scenario and other techniques for > "meta > > tagging" nodes and properties with type or other semantic info. > > > > > > > > Thanks, > > > > > > > > Rick > > > > _______________________________________________ > > Neo mailing list > > User@lists.neo4j.org > > https://lists.neo4j.org/mailman/listinfo/user > > > _______________________________________________ > Neo mailing list > User@lists.neo4j.org > https://lists.neo4j.org/mailman/listinfo/user > > _______________________________________________ > Neo mailing list > User@lists.neo4j.org > https://lists.neo4j.org/mailman/listinfo/user > -- Tobias Ivarsson <tobias.ivars...@neotechnology.com> Hacker, Neo Technology www.neotechnology.com Cellphone: +46 706 534857 _______________________________________________ Neo mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user