I created a wiki page for indexed relationships in the Git repo, see: https://github.com/peterneubauer/graph-collections/wiki/Indexed-relationships
> From: [email protected] > Date: Thu, 7 Jul 2011 22:53:05 +0200 > To: [email protected] > Subject: Re: [Neo4j] Indexed relationships > > 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 _______________________________________________ Neo4j mailing list [email protected] https://lists.neo4j.org/mailman/listinfo/user

