Thanks

Michael

Am 08.07.2011 um 01:19 schrieb Niels Hoogeveen:

> 
> I created a wiki page for indexed relationships in the Git repo, see: 
> https://github.com/peterneubauer/graph-collections/wiki/Indexed-relationships
> 
>> From: michael.hun...@neotechnology.com
>> Date: Thu, 7 Jul 2011 22:53:05 +0200
>> To: user@lists.neo4j.org
>> 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: pd_aficion...@hotmail.com
>>>> To: user@lists.neo4j.org
>>>> 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: pd_aficion...@hotmail.com
>>>>> To: user@lists.neo4j.org
>>>>> 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: michael.hun...@neotechnology.com
>>>>>> Date: Thu, 7 Jul 2011 13:27:00 +0200
>>>>>> To: user@lists.neo4j.org
>>>>>> 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: pd_aficion...@hotmail.com
>>>>>>>> To: user@lists.neo4j.org
>>>>>>>> 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: neubauer.pe...@gmail.com
>>>>>>>>> To: user@lists.neo4j.org
>>>>>>>>> Subject: Re: [Neo4j] Indexed relationships
>>>>>>>>> 
>>>>>>>>> Great work Nils!
>>>>>>>>> 
>>>>>>>>> /peter
>>>>>>>>> 
>>>>>>>>> Sent from my phone.
>>>>>>>>> On Jul 4, 2011 11:39 PM, "Niels Hoogeveen" <pd_aficion...@hotmail.com>
>>>>>>>>> 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: pd_aficion...@hotmail.com
>>>>>>>>>>> To: user@lists.neo4j.org
>>>>>>>>>>> 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: pd_aficion...@hotmail.com
>>>>>>>>>>>> To: user@lists.neo4j.org
>>>>>>>>>>>> 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
>>>>>>>>>>>> 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
>>>>>> 
>>>>>> _______________________________________________
>>>>>> 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

_______________________________________________
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user

Reply via email to