Could you put these code examples into the Readme for the project or on a wiki page?
Am 07.07.2011 um 22:11 schrieb Niels Hoogeveen: > > IndexedRelationship and IndexedRelationshipExpander are now in Git. See: > https://github.com/peterneubauer/graph-collections/tree/master/src/main/java/org/neo4j/collections/indexedrelationship > An example: > class IdComparator implements java.util.Comparator<Node>{ > public int compare(Node n1, Node n2){ > long l1 = Long.reverse(n1.getId()); > long l2 = Long.reverse(n2.getId()); > if(l1 == l2) return 0; > else if(l1 < l2) return -1; > else return 1; > } > }static enum RelTypes implements RelationshipType{ > DIRECT_RELATIONSHIP, > INDEXED_RELATIONSHIP, > }; > Node indexedNode = graphDb().createNode(); > IndexedRelationship ir = new > IndexedRelationship(RelTypes.INDEXED_RELATIONSHIP, Direction.OUTGOING, new > IdComparator(), true, indexedNode, graphDb()); > > Node n1 = graphDb().createNode(); > n1.setProperty("name", "n1"); > Node n2 = graphDb().createNode(); > n2.setProperty("name", "n2"); > Node n3 = graphDb().createNode(); > n3.setProperty("name", "n3"); > Node n4 = graphDb().createNode(); > n4.setProperty("name", "n4"); > > indexedNode.createRelationshipTo(n1, RelTypes.DIRECT_RELATIONSHIP); > indexedNode.createRelationshipTo(n3, RelTypes.DIRECT_RELATIONSHIP); > ir.createRelationshipTo(n2); > ir.createRelationshipTo(n4); > > IndexedRelationshipExpander re1 = new IndexedRelationshipExpander(graphDb(), > Direction.OUTGOING, RelTypes.DIRECT_RELATIONSHIP); > IndexedRelationshipExpander re2 = new IndexedRelationshipExpander(graphDb(), > Direction.OUTGOING, RelTypes.INDEXED_RELATIONSHIP); > > for(Relationship rel: re1.expand(indexedNode)){ > System.out.println(rel.getEndNode().getProperty("name")); > } > for(Relationship rel: re2.expand(indexedNode)){ > System.out.println(re2.getEndNode().getProperty("name")); > } >> From: [email protected] >> To: [email protected] >> Date: Thu, 7 Jul 2011 16:55:36 +0200 >> Subject: Re: [Neo4j] Indexed relationships >> >> >> Hi Michael,I realize that the implementation of IndexedRelationship can in >> fact support returning relationships, and I have a preliminary version >> running locally now.The returned relationships can support all methods of >> the Relationship interface, returning the node pointing to the treeRoot as >> the startNode, and returning the node set as the key_value as the >> endNode.All relationship properties will be stored on the KEY_VALUE >> relationship pointing to the endNode.There is one caveat to this solution, >> the returned relationships cannot support the getId() method,and will throw >> an UnsupportedOperationException when being called.IndexedRelationship will >> implement Iterable<Relationship>.With these changes, it is possible to >> create an Expander and I am working right now to implement that.Niels >> >>> From: [email protected] >>> To: [email protected] >>> Date: Thu, 7 Jul 2011 14:46:35 +0200 >>> Subject: Re: [Neo4j] Indexed relationships >>> >>> >>> Hi Michael, >>> >>> I haven't yet worked on an example. >>> >>> There are tests for the SortedTree implementation, >>> but didn't add those to the IndexedRelationship class, >>> which is simply a wrapper around SortedTree. >>> Having a test would have caught the error >>> that no relationship to the treeNode was created >>> (fixed that bug and pushed it to Git) >>> (note to self: always create a unit test, >>> especially when code seems trivial). >>> >>> There is no relationship expander that uses this. >>> The RelationshipExpander has a method Iterable<Relationship> expand(Node >>> node) >>> which cannot be supported, since there is no direct relationship from >>> startnode to endnode. >>> Instead there is a path through the index tree. >>> >>> It's not possible to support the original relationship-traversal API >>> since the IndexedRelationship class is not a wrapper around a node, >>> but a wrapper around the relationships of a certain RelationshipType in the >>> OUTGOING direction. >>> >>> As to the name of the class. >>> It is essentially an indexed relationship, >>> and not just a solution to the densely-connected-node problem. >>> An indexed relationship can also be used to maintain >>> a sorted set of relationships of any size, >>> and can be used to guarantee unicity constraints. Niels >>>> From: [email protected] >>>> Date: Thu, 7 Jul 2011 13:27:00 +0200 >>>> To: [email protected] >>>> Subject: Re: [Neo4j] Indexed relationships >>>> >>>> Good work, >>>> >>>> do you have an example ready (and/or some tests that show how it works/is >>>> used) ? >>>> >>>> In creation, manual traversal and automatic traversal (i.e. is there a >>>> RelationshipExpander that uses it). >>>> >>>> And in the constructor if there is no relationship to the treeNode, you >>>> create a new one, but that new treeNode is not connected to the actual >>>> node? >>>> >>>> I'm not sure if it should support the original relationship-traversal API >>>> / methods (getRelationships(Dir,type), etc). >>>> >>>> Perhaps that IndexedRelationship should rather be just a wrapper around a >>>> SuperNode ? So probably rename it to "SuperNode(Wrapper) or >>>> HeavilyConnectedNode(Wrapper) ?) >>>> >>>> Cheers >>>> >>>> Michael >>>> >>>> Am 07.07.2011 um 12:51 schrieb Niels Hoogeveen: >>>> >>>>> >>>>> Finished the implementation of indexed relationships. The graph >>>>> collections component now contains the package >>>>> https://github.com/peterneubauer/graph-collections/tree/master/src/main/java/org/neo4j/collections/indexedrelationship, >>>>> containing the IndexedRelationship class. >>>>> This class can be used instead of regular relationships >>>>> when:relationships need to be stored in a particular sort ordera unicity >>>>> constraint needs to be guaranteed nodes become densely populated with >>>>> relationships. >>>>> The implementation is traverser friendly. Given a start nodes all end >>>>> nodes can be found by following four relationships types in outgoing >>>>> direction. Given an end node the start node can be found by following >>>>> these four relationship types in incoming direction. Of course this >>>>> functionality is also covered in the API. >>>>> Niels >>>>> >>>>>> From: [email protected] >>>>>> To: [email protected] >>>>>> Date: Thu, 7 Jul 2011 02:36:29 +0200 >>>>>> Subject: Re: [Neo4j] Indexed relationships >>>>>> >>>>>> >>>>>> Pushed SortedTree to Git after adding a unit test and doing some >>>>>> debugging. >>>>>> TODO:Add API for indexed relationships using SortedTree as the >>>>>> implementation.Make SortedTree thread safe. >>>>>> With regard to the latter issue. I am considering the following >>>>>> solution. Acquire a lock (delete a non existent property) on the node >>>>>> that points to the root of the tree at the start of AddNode, RemoveNode >>>>>> and Delete. No other node in the SortedTree is really stable, even the >>>>>> rootnode may be moved down, turning another node into the new rootnode, >>>>>> while after a couple of remove actions the original rootnode may even be >>>>>> deleted. >>>>>> Locking the node pointing to the rootnode, prevents all other >>>>>> threads/transactions from updating the tree. This may seem restrictive, >>>>>> but a single new entry or a single removal may in fact have impact on >>>>>> much of the tree, due to balancing. More selective locking would require >>>>>> a prebalancing tree walk, determining the affected subtrees, lock them >>>>>> and once every affected subtree is locked, perform the actual balancing. >>>>>> Please let me hear if there are any objections to locking the node >>>>>> pointing to the tree as the a solution to make SortedTree thread safe. >>>>>> Niels >>>>>> >>>>>>> Date: Tue, 5 Jul 2011 08:27:57 +0200 >>>>>>> From: [email protected] >>>>>>> To: [email protected] >>>>>>> Subject: Re: [Neo4j] Indexed relationships >>>>>>> >>>>>>> Great work Nils! >>>>>>> >>>>>>> /peter >>>>>>> >>>>>>> Sent from my phone. >>>>>>> On Jul 4, 2011 11:39 PM, "Niels Hoogeveen" <[email protected]> >>>>>>> wrote: >>>>>>>> >>>>>>>> Made some more changes to the SortedTree implementation. Previously >>>>>>> SortedTree would throw an exception if a duplicate entry was being >>>>>>> added. >>>>>>>> I changed SortedTree to allow a key to point to more than one node, >>>>>>>> unless >>>>>>> the SortedTree is created as a unique index, in which case an exception >>>>>>> is >>>>>>> raised when an attempt is made to add a node to an existing key entry. >>>>>>>> A SortedTree once defined as unique can not be changed to a non-unique >>>>>>> index or vice-versa. >>>>>>>> SortedTrees now have a name, which is stored in the a property of the >>>>>>> TREE_ROOT relationship and in the KEY_VALUE relationship (a new >>>>>>> relationship >>>>>>> that points from the SortedTree to the Node inserted in the >>>>>>> SortedTree). The >>>>>>> name of a SortedTree can not be changed. >>>>>>>> SortedTrees now store the class of the Comparator, so a SortedTree, >>>>>>>> once >>>>>>> created, can not be used with a different Comparator. >>>>>>>> SortedTree is now an Iterable, making it possible to use it in a >>>>>>> foreach-loop. >>>>>>>> Since there are as of yet, no unit tests for SortedTree, I will create >>>>>>> those first before pushing my changes to Git. Preliminary results so >>>>>>> far are >>>>>>> good. I integrated the changes in my own application and it seems to >>>>>>> work >>>>>>> fine. >>>>>>>> Todo: >>>>>>>> Decide on an API for indexed relationships. (Community input still >>>>>>> welcome).Write unit tests.Make SortedTree thread safe (Community help >>>>>>> still >>>>>>> welcome). >>>>>>>> Niels >>>>>>>> >>>>>>>>> From: [email protected] >>>>>>>>> To: [email protected] >>>>>>>>> Date: Mon, 4 Jul 2011 15:49:45 +0200 >>>>>>>>> Subject: Re: [Neo4j] Indexed relationships >>>>>>>>> >>>>>>>>> >>>>>>>>> I forgot to add another recurrent issue that can be solved with >>>>>>>>> indexed >>>>>>> relationships: guaranteed unicity constraints. >>>>>>>>>> From: [email protected] >>>>>>>>>> To: [email protected] >>>>>>>>>> Date: Mon, 4 Jul 2011 01:55:08 +0200 >>>>>>>>>> Subject: [Neo4j] Indexed relationships >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> In the thread [Neo4j] traversing densely populated nodes we discussed >>>>>>> the problems arising when large numbers of relationships are added to >>>>>>> the >>>>>>> same node. >>>>>>>>>> Over the weekend, I have worked on a solution for the >>>>>>> dense-relationship-nodes using SortedTree in the neo-graph-collections >>>>>>> component. After some minor tweaks to the implementation of SortedTree, >>>>>>> I >>>>>>> have managed to get a workable solution, where two nodes are not >>>>>>> directly >>>>>>> linked by a relationship, but by means of a BTree (entirely stored in >>>>>>> the >>>>>>> graph). >>>>>>>>>> Before continuing this work, I'd like to have a discussion about >>>>>>> features, since what we have now is not just a solution for the dense >>>>>>> populated node issue, but is actually a full fledges indexed >>>>>>> relationship, >>>>>>> which makes it suitable for other purposes too. >>>>>>>>>> An indexed relationship can for example be used to maintain a sorted >>>>>>> set of relationships in the graph, that is not necessarily huge, but >>>>>>> large >>>>>>> enough to make sorting on internal memory too expensive an operation, or >>>>>>> situations where only one out of a large number of relationships is >>>>>>> actually >>>>>>> traversed in most cases. >>>>>>>>>> There are probably more use cases for in-graph indexed relationships, >>>>>>> so I'd like to know what features are desirable and what API would Neo4J >>>>>>> users appreciate. >>>>>>>>>> P.S. I still think it would be good to consider, if technically >>>>>>> possible, partitioning the relationship store per relationship type and >>>>>>> per >>>>>>> direction. The indexed relationship solution works, but is of course >>>>>>> slower >>>>>>> than a direct relationship, both with respect to insert time and >>>>>>> traversal >>>>>>> time. If dense relationships are never traversed going out of the dense >>>>>>> node, the extra structure maintained by the BTree is only extra burden. >>>>>>>>>> P.P.S. If there are people with experience to make an implementation >>>>>>> thread safe, please volunteer to help make the implementation production >>>>>>> proof. >>>>>>>>>> Niels >>>>>>>>>> _______________________________________________ >>>>>>>>>> Neo4j mailing list >>>>>>>>>> [email protected] >>>>>>>>>> https://lists.neo4j.org/mailman/listinfo/user >>>>>>>>> >>>>>>>>> _______________________________________________ >>>>>>>>> Neo4j mailing list >>>>>>>>> [email protected] >>>>>>>>> https://lists.neo4j.org/mailman/listinfo/user >>>>>>>> >>>>>>>> _______________________________________________ >>>>>>>> Neo4j mailing list >>>>>>>> [email protected] >>>>>>>> https://lists.neo4j.org/mailman/listinfo/user >>>>>>> _______________________________________________ >>>>>>> Neo4j mailing list >>>>>>> [email protected] >>>>>>> https://lists.neo4j.org/mailman/listinfo/user >>>>>> >>>>>> _______________________________________________ >>>>>> Neo4j mailing list >>>>>> [email protected] >>>>>> https://lists.neo4j.org/mailman/listinfo/user >>>>> >>>>> _______________________________________________ >>>>> Neo4j mailing list >>>>> [email protected] >>>>> https://lists.neo4j.org/mailman/listinfo/user >>>> >>>> _______________________________________________ >>>> Neo4j mailing list >>>> [email protected] >>>> https://lists.neo4j.org/mailman/listinfo/user >>> >>> _______________________________________________ >>> Neo4j mailing list >>> [email protected] >>> https://lists.neo4j.org/mailman/listinfo/user >> >> _______________________________________________ >> Neo4j mailing list >> [email protected] >> https://lists.neo4j.org/mailman/listinfo/user > > _______________________________________________ > Neo4j mailing list > [email protected] > https://lists.neo4j.org/mailman/listinfo/user _______________________________________________ Neo4j mailing list [email protected] https://lists.neo4j.org/mailman/listinfo/user

