I don't understand why you wrapped _all_ the classes, this will make this package very brittle as it has to copy all API changes?
I rather thought of a better / fluent / more usable API on top of the existing one. something like new Graph(gbd).autoIndex("name") .node("name","Niels") .relateTo("works_on","repo","graph_collections","language","Java").index("repo","language") .node("name","Someone", "age",20,"gender",Gender.MALE,"birthday",sdf.parse("01.01.1970")); int node.getProperty("age", int.class); etc. Just convenience for users. And I don't really understand what property-type is for. I thought you were only working on n-ary relationships? Btw. you can replace those unholy if clauses with polymorphism in the enum. Are there some tests and/or examples that uses this API ? Cheers Michael Am 23.07.2011 um 21:02 schrieb Niels Hoogeveen: > > Traverser and Index are wrapped too now, so the entire API as can be accessed > from GraphDatabaseService is now available in enhanced API version. > The API is a drop-in replacement, all that needs to be done to make an > application work against the enhanced API, is to change imports. > > From: pd_aficion...@hotmail.com > To: user@lists.neo4j.org > Subject: RE: [Neo4j] Hyperedges and Objects > Date: Fri, 22 Jul 2011 04:00:18 +0200 > > > > > > > > > I uploaded the first edit (still needs to completely be tested - IS-PRE-ALPHA > quality) of the enhanced API. > > See: > https://github.com/peterneubauer/graph-collections/tree/master/src/main/java/org/neo4j/collections/graphdb > > The enhanced API has several new features: > > > 1.) A new interface RelationshipContainer, supporting createRelation, > getRelation, and hasRelation methods. > > > 2.) Relationship implements RelationshipContainer so relationships to and > from relationships can be created. > A relationship property is maintained containing the node ID of an associated > node. This node is lazily created (and with that the relationship property is > set). > Relationships are stored on the associated node, while properties are stored > on the relationship itself. > > > 3.) EnhancedRelationshipType implements RelationshipContainer (and with that > PropertyContainer) so RelationshipTypes can have properties and relationships. > > A node associated with a RelationshipType is created lazily. From the > reference node a RELTYPE_SUBREF relation points to a node, containing > properties corresponding to RelationshipType names. The value of this > property is the node ID of the RelationshipType associated node. > > All relationships creation to and from a EnhancedRelationshipType and all > properties setting on a EnhancedRelationshipType are performed on the > associated node. > All retrievals are done from the associated node. > > The associated node is created the first time it is needed. > > 4.) PropertyType implements RelationshipContainer (and with that > PropertyContainer). PropertyTypes can be used in getProperty, setProperty and > hasProperty style operations. > > PropertyTypes are parameterized with the datatype of the property. This makes > it possible to support methods such as: <T> getPropertyValue(PropertyType) > and setProperty(PropertyType<T>, T) that guard property values added conform > to the datatype presumed by the PropertyType and property values are returned > typed. > > A node associated with a PropertyType is created lazily. From the reference > node a PROPTYPE_SUBREF relation points to a node, which points to nodes per > datatype. > These datatype related nodes contain properties corresponding to PropertyType > names. > > All relationships creation to and from a PropertyType and all properties > setting on a PropertyType are performed on the associated node. All > retrievals are done from the associated node. > > The associated node is created the first time it is needed. > > 5.) GraphDatabaseService allows for the lookup of PropertyTypes and > RelationshipTypes and enhanced Nodes and Relationships. > > > 6.) Property implements RelationshipContainer (and with that > PropertyContainer). //TODO > A node associated to a property is created lazily, allowing properties to > have relationships and properties. > The associated node is created the first time it is needed. > > With these enhancements, all elements of Neo4j (Node, Relationship, > RelationshipType, property name and property value) are unified, sharing a > common interface RelationshipContainer (and with that PropertyContainer). > Node and Relationship also extend their original interfaces, so the API is a > drop-in replacement for the original API. > > Both ProperyType and RelatioshipType now provide the necessary methods to > implement a type/class system on top of Neo4j, but nothing imposes a > type/class system. > > Being able to create Relationships to and from Relationships opens the way to > a transparent implementation of n-ary relationships. > > > This is all neat, I believe, but I would be really happy if there could be > some support in core to hide the implementation a bit more. > > Now: > > 1.) Relationships can have a property containing the node ID of the > associated node. This polutes the namespace, so it would be better if there > were a setLong and getLong method on Relationship, where the node ID can be > stored, keeping the property name away from the property namespace. > > 2.) Named persistent maps from String to PropertyContainer. This would > eliminate the REL_SUBREF related node and the PROP_SUBREF related nodes. It > would be nice if these enhancements didn't polute the node space. Named > persistent maps from String to PropetyContainer would also be helpful for > fast lookup of uris and generally for the creation of unique keys. > > Niels >> Date: Thu, 21 Jul 2011 20:38:15 +0200 >> From: matt...@neotechnology.com >> To: user@lists.neo4j.org >> Subject: Re: [Neo4j] Hyperedges and Objects >> >> Niels, >> >> sounds like fun. Looking forward to get a look at this >> >> 2011/7/21 Niels Hoogeveen <pd_aficion...@hotmail.com> >> >>> >>> i made a start on this. It's not all too difficult to enhance relationships >>> such that relationships can be created upon them, which is a first step >>> towards supporting hypergraphs. In fact hypergraphs are more constrained >>> than an enhanced graph that supports the creation of relationships on >>> relationships. >>> As it stands now, the enhanced graph can work as a drop-in replacement of >>> the standard neo4j API and has enhanced methods that mirror the standard >>> methods. >>> I also added support for typed properties, such that methods like <T> >>> getPropertyValue<PropertyType<T>> are possible where <T> is one of the data >>> types supported by PropertyContainer. >>> I will upload this within the next few days. >>> Niels >>> >>> >>> From: pd_aficion...@hotmail.com >>> To: user@lists.neo4j.org >>> Subject: RE: [Neo4j] Hyperedges and Objects >>> Date: Mon, 18 Jul 2011 17:59:08 +0200 >>> >>> >>> >>> >>> >>> >>> >>> >>> I think a hypergraph would be an interesting collection to support in >>> neo-graph-collections. If I find the time, I will make a start with it this >>> week, unless there are of course other volunteers :wink: willing to do the >>> lifting here. >>> Niels >>> >>>> From: michael.hun...@neotechnology.com >>>> Date: Sat, 16 Jul 2011 23:37:48 +0200 >>>> To: user@lists.neo4j.org >>>> Subject: Re: [Neo4j] Hyperedges and Objects >>>> >>>> I completely agree, >>>> >>>> hyperedges and the accompanying traversers should be handled in a >>> library. As you probably know the traversal framework currently also uses >>> the core API under the hood to perform the traversals (and no black magic >>> (yet)). >>>> >>>> So it should be fairly easy to take that approach/code and create a >>> library that abstracts the hyper-edge issues (creation, deletion, >>> traversal). The position semantics based approach sounds interesting. >>>> >>>> Would love to see that as community contribution. >>>> >>>> Cheers >>>> >>>> Michael >>>> >>>> Am 16.07.2011 um 23:08 schrieb Niels Hoogeveen: >>>> >>>>> >>>>> The question is how much easier a traverser can become when there were >>> dedicated hyper edges. In a binary relation it is fairly easy to define one >>> end of the relation as the source and the other as the target (start and end >>> node), >>>>> but in n-ary relationships the roles of the attached nodes become more >>> complicated. >>>>> >>>>> Suppose we have the GIVES relationship, where one attached node takes >>> the role of subject (the giver), >>>>> one node takes the role of direct object (the gift), and another node >>> takes the role of indirect object (the recipient). >>>>> To traverse such a graph, we need to know these different roles, >>> otherwise we may end up traversing the wrong nodes. >>>>> >>>>> Suppose we the following statements: >>>>> >>>>> John gives Paul a servant. >>>>> Paul visited Albania. >>>>> Paul's servant visited Albania. >>>>> >>>>> We now want to know all people that received a gift from John and who >>> visited Albania. >>>>> >>>>> Without properly denoting the roles in the ternary relationship stated >>> by "John gives Paul a servant", >>>>> the answer to the query may well be: Paul and Paul's servant. >>>>> Both are persons, both have visited Albania and both are part of the >>> GIVES relationship defined. >>>>> >>>>> When we have to define the exact roles of each part of an n-ary >>> relationship for each traversal, >>>>> it is just as complicated as defining a traversal based on binary >>> relationships, >>>>> where different relationship types denote the roles of each part of the >>> n-ary relationship. >>>>> >>>>> If hyperedges were to be introduced, either as a library or in core, >>>>> the entire notion of the graph and how traversals are performed need to >>> be rethought. >>>>> >>>>> The concept of an edge as having a start and an end node doesn't >>> translate well into the world of hyper edges. >>>>> There is not necessarily a start node and an end node, >>>>> instead there are various nodes that are distinctly attached to the >>> hyper edge. >>>>> >>>>> One way to think about an edge in both the graph and in the hypergraph >>> world is as a tuple. >>>>> >>>>> A binary relationship can be thought of as the tuple: >>>>> >>>>> (node1, node2, RelationshipType, Set(property)) >>>>> >>>>> A ternary relationship can be thought of as the tuple: >>>>> >>>>> (node1, node2, node3, RelationshipType, Set(property)) >>>>> >>>>> etc... >>>>> >>>>> Instead of marking a binary relationship as outgoing or incoming, we >>> can use the position in the tuple to denote its role. >>>>> We can say the first node in the tuple corresponds to the start node, >>> and the second node in the tuple corresponds to the end node. >>>>> Having two possible permutations relates to the two possible directions >>> an edge can have. >>>>> >>>>> Position based definitions of relationships translate well into the >>> domain of n-ary relationships, >>>>> though the semantics of such relationships can easily become difficult. >>>>> A ternary relationship already has 6 permutations for the attached >>> nodes, >>>>> while a 10-ary relationship has 3,628,800 possible permutations. >>>>> >>>>> It would be an interesting project to design a tuple-position-based >>> traverser. >>>>> For binary relationships it should have the exact same features as the >>> current direction based traverser, >>>>> but it would be possible to generalize that design to n-ary >>> relationships. >>>>> This can all be done as a libary. >>>>> >>>>> Only when perfomance can be really improved in core, does it make sense >>> to request for native support. >>>>> >>>>> Niels >>>>>> Date: Sat, 16 Jul 2011 19:31:22 +0200 >>>>>> From: ntausc...@gmail.com >>>>>> To: user@lists.neo4j.org >>>>>> Subject: Re: [Neo4j] Hyperedges and Objects >>>>>> >>>>>> That's clear. Such mappings are more difficult to traverse since the >>>>>> traverser has to know if there is such a hyper edge vertex. I'm >>>>>> wondering if there is no need to provide an embedded solution for such >>> a >>>>>> transformation. Each user who is confronted with hyper edges has to >>>>>> implement some kind of such mapping. It would be helpful, for example, >>>>>> if each Neo4j relationship can manage hyper edges automatically and >>>>>> provide an additional 'isHyper' method pointing out that there are >>>>>> additional methods allowing to get all further incident nodes. This is >>>>>> also a matter of performance. I think such a handling is implemented >>>>>> most efficiently within the Neo4j engine. >>>>>> >>>>>> Best regards >>>>>> >>>>>> Norbert Tausch >>>>>> >>>>>> Am 16.07.2011 00:52, schrieb Niels Hoogeveen: >>>>>>> Hyper edges can be emulated. >>>>>>> Suppose you want to store the fact "John gives Pete a book". >>>>>>> This is indeed a ternary relationship, which would call for an hyper >>> edge. >>>>>>> This fact can be stored as follows: >>>>>>> Some act of giving --Giver-->JohnSome act of giving --Recipient--> >>> PeteSome act of giving --Gift--> book >>>>>>> N-ary relationships can generally be decomposed into N binary >>> relationships, where a central node is used to used as a placeholder for the >>> N-ary relationship. >>>>>>> Complex types can either be stored into a byte array or if >>> appropriate in multiple properties. >>>>>>> >>>>>>> >>>>>>>> Date: Sat, 16 Jul 2011 00:04:15 +0200 >>>>>>>> From: ntausc...@gmail.com >>>>>>>> To: user@lists.neo4j.org >>>>>>>> Subject: [Neo4j] Hyperedges and Objects >>>>>>>> >>>>>>>> Hi, >>>>>>>> >>>>>>>> is there a possibility to store hyper edges in Neo4j? Is there a >>> plan to >>>>>>>> implement this? >>>>>>>> >>>>>>>> Will Neo4j get the ability to store complex types in addition to >>>>>>>> primitve data types for properties of nodes and relationships? >>>>>>>> >>>>>>>> -- >>>>>>>> Best regards >>>>>>>> >>>>>>>> Norbert Tausch >>>>>>>> >>>>>>>> _______________________________________________ >>>>>>>> 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 >>>>> >>>>> _______________________________________________ >>>>> 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 >>> >> >> >> >> -- >> Mattias Persson, [matt...@neotechnology.com] >> Hacker, Neo Technology >> www.neotechnology.com >> _______________________________________________ >> 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