A golden helicopter might do the trick :) 2011/8/3 Niels Hoogeveen <pd_aficion...@hotmail.com>
> > How does one persuade the time allocation authorities? > Niels > > > Date: Wed, 3 Aug 2011 09:28:45 +0200 > > From: matt...@neotechnology.com > > To: user@lists.neo4j.org > > Subject: Re: [Neo4j] Node#getRelationshipTypes > > > > Yup, it's a pretty sane approach and somewhat along the lines of how I > feel > > it would be done. It's been said a long time that "this functionality > will > > be implemented some day" and it's just that a significant amount of time > > have to be invested... maybe not for implementing it, but for discovering > > all bugs and inconveniences to have it on par with production quality. > And > > that kind of time haven't been allocated yet. > > > > I appreciate your thoughts and time on all this! > > > > Best, > > Mattias > > > > 2011/8/3 Niels Hoogeveen <pd_aficion...@hotmail.com> > > > > > > > > I would like to make a suggestion that would both address my feature > > > request and increase performance of the database. > > > > > > Right now the NodeRecord > (org.neo4j.kernel.impl.nioneo.store.NodeRecord) > > > contains the ID of the first Relationship, while the RelationshipRecord > > > contain the ID's of the previous and next relationship for both sides > of the > > > relationship. > > > > > > My suggestion is as follows: > > > > > > Create a new store: > > > > > > noderelationshiptypestore.db > > > > > > The layout of this store is given by the NodeRelationshipTypeRecord: > > > > > > id > > > previousrelationshiptype > > > nextrelationshiptype > > > firstrelationship > > > > > > The NodeRecord would now need to point to the first outgoing > > > NodeRelationshipType and to the first incoming NodeRelationshipType > instead > > > of to the first Relationship. > > > > > > On insert of a Relationship, one side of the relationship will update > the > > > store from the outgoing side, the other side will update the store for > the > > > incoming side. > > > > > > I will list the steps to take here for the outgoing side (the incoming > side > > > is almost identical). > > > > > > From the NodeRecord getFirstNodeRelationType (outgoing). > > > > > > Keep following NextRelationshipType until the desired record is found. > If > > > no record exists, create one, make the current > FirstNodeRelationshipType in > > > the NodeRecord (if it exists) the NextRelationshipType of the created > > > NodeRelationshipType (and make the created one the previous of the > current > > > one) and make the created NodeRelationshipType the > FirstNodeRelationshipType > > > in the NodeRecord. > > > > > > In other words: find the NodeRelationshipTypeRecord in the linked list. > If > > > none exists, create a NodeRelationshipTypeRecord, prepend it to the > existing > > > list and change the entry point in the NodeRecord. > > > > > > We now have found the requested NodeRelationshipTypeRecord. > > > > > > From NodeRelationshipTypeRecord getFirstRelationship. > > > > > > Create a new RelationshipRecord and make it the FirstRelationship in > the > > > NodeRelationshipTypeRecord. > > > > > > Make the old first RelationshipRecord (if it exists) the > nextRelationship > > > of the new first RelationshipRecord and make the new first > > > RelationshipRecord the previous of the old first RelationshipRecord. > > > > > > In other words: prepend a new RelationshipRecord to the existing list > of > > > Relationships and change the entry point in the > NodeRelationshipTypeRecord. > > > > > > Do the same for the incoming side (except for the creation of the > > > RelationshipRecord, we only need one of those). > > > > > > Instead of a linked list of Relationships per Node we now have two > linked > > > lists of RelationshipTypes per Node (one incoming, one outgoing), with > a > > > linked list of Relationships per NodeRelationshipType. > > > > > > With this approach only those Relationships need to be read that match > the > > > RelationshipType and Direction given. > > > > > > Worst case this approach leads to an extra read operation per > > > RelationshipType: > > > > > > Worst case example 1: Retrieve all Relationships, regardless of > > > Relationship or Direction. Here we have extra reads for all > > > NodeRelationshipType records. If the number of Relationships per > > > NodeRelationshipType is equal to 1, we have twice as many reads. > > > > > > Worst case example 2: If we retrieve Relationships by RelationshipType > by > > > Direction, we have at most one extra read to fetch the Relationship, > and > > > only in the case where the number of Relationships per > NodeRelationshipType > > > is equal to 1 and the requested RelationshipType happens to be the last > in > > > the list. > > > > > > On average partitioning Relationships the way suggested here improves > > > performance, while the worst case situations only take a constant time > hit > > > of no more than a factor 2. On top of that the absolute worst case > > > situation, where the performance is reduced by a factor 2 is likely to > be > > > uncommon in practical Neo4j applications. > > > > > > Certainly there will be situations where users want to iterate over all > > > relationships of one particular node, which will still be very fast. It > is > > > much less likely that users would frequently want to iterate over all > > > relationships of a huge number of nodes (where all those relationships > > > happen to be functional as well). Most traversals will be much more > > > discriminate and be based on certain particular RelationshipType where > the > > > performance penalty is at most one read operation per RelationshipType, > but > > > on average the number of reads will be lower, certainly if there is > more > > > than one Relationship associated to the NodeRelationshipType.The > potential > > > performance increase can be enormous, especially if we want to fetch a > > > relationship of a RelationshipType that has few associated > Relationships, > > > while some other NodeRelationshipType has a huge number of > Reltionships.Best > > > case scenario: A node has one Relationship of type A and 1 million > > > Relationships of type B and we want to fetch t > > > hat one Relationship of type A. In the current situation we have to do > > > 1,000,001 reads to fetch that one Relationship. With this proposal this > > > would be reduced to at most 3 reads for that particular request. > > > Altogether this proposal has advantages in most practical situations. > In > > > some corner cases the performance may decrease by at most a factor 2, > while > > > the performance may increase by orders of magnitude in some quite > common use > > > cases. > > > On top of that, we can also present the meta information I requested, > > > because we can simply iterate over the NodeRelationshipType list and > return > > > the entries to the user. > > > > > > Finally, this proposal makes it possible to guarantee functional, > > > surjective and one-to-one Relationships. Due to the partitioning we > will > > > know if there already is a relationship of a certain type. If a > relationship > > > is stated to be functional, surjective, or one-to-one, we can raise an > > > exception when a second relationship is about to be created for that > > > particular NodeRelationshipType. > > > > > > Niels > > > > > > > > > > > > > From: pd_aficion...@hotmail.com > > > > To: user@lists.neo4j.org > > > > Date: Tue, 2 Aug 2011 23:03:41 +0200 > > > > Subject: Re: [Neo4j] Node#getRelationshipTypes > > > > > > > > > > > > Building an API on top of Neo4j of course pushes the standard API to > its > > > limits. So for that matter it is already a good exercise. > > > > Any chance this feature request will find its way into 1.5? > > > > Niels > > > > > > > > > Date: Tue, 2 Aug 2011 22:33:03 +0200 > > > > > From: matt...@neotechnology.com > > > > > To: user@lists.neo4j.org > > > > > Subject: Re: [Neo4j] Node#getRelationshipTypes > > > > > > > > > > Those methods will of course be more efficient if implemented in > the > > > kernel > > > > > compared to iterating through all relationships if the whole > > > relationship > > > > > chain have already been loaded for that node, otherwise it will > require > > > a > > > > > full iteration (or at least making sure the whole chain have been > > > loaded). > > > > > I've never found a use case for it myself and this is the first > I've > > > heard. > > > > > > > > > > 2011/8/1 Niels Hoogeveen <pd_aficion...@hotmail.com> > > > > > > > > > > > > > > > > > I have two specific use cases for these methods: > > > > > > I'd like to present a node with the property types (names) it has > > > content > > > > > > for and with the relationship types it has relationships for, > while > > > loading > > > > > > those properties/relationships on demand (ie. click here to see > > > details). > > > > > > This can be done for properties: there is a getPropertyKeys() > method, > > > but > > > > > > there is no getRelationshipTypes() method. > > > > > > The other use case has to do with the Enhanced API. There I want > to > > > have > > > > > > pluggable relationships and properties. With respect to > relationships > > > there > > > > > > are already three implementations: the regular Relationship, > > > SortedRelations > > > > > > (which use an in-graph Btree for storage) and HyperRelationships > > > which allow > > > > > > n-ary relationships. > > > > > > Every Element in Enhanced API has a getRelationships() method, > much > > > like > > > > > > the getRelationships() method in Node, which should return every > > > > > > relationship attached to an Element, irrespective of its > > > implementation. > > > > > > Right now the Element implementation has to perform the logic to > > > distinguish > > > > > > which relationship is used for what implementation (under the > hood it > > > all > > > > > > works using normal Relationships). It would be much more elegant > to > > > iterate > > > > > > over the RelationshipTypes and dispatch the getRelationships() > method > > > to the > > > > > > appropriate RelationshipType implementations. That way the logic > for > > > > > > SortedRelationships, HyperRelationships remains in their > associated > > > classes > > > > > > and is not spread around the implementation. > > > > > > > > > > > > Niels > > > > > > > From: michael.hun...@neotechnology.com > > > > > > > Date: Sun, 31 Jul 2011 23:20:50 +0200 > > > > > > > To: user@lists.neo4j.org > > > > > > > Subject: Re: [Neo4j] Node#getRelationshipTypes > > > > > > > > > > > > > > Imho it would have to iterate as well. > > > > > > > > > > > > > > As the type is stored with the relationship record and so can > only > > > be > > > > > > accessed after having read it. > > > > > > > > > > > > > > It might be to have some minimal performance improvements that > > > > > > relationships would not have to be fully loaded, nor put into the > > > cache for > > > > > > that. But this is always a question of the use-case. What will be > > > done next > > > > > > with those rel-types. > > > > > > > > > > > > > > What was the use-case for this operation again? > > > > > > > > > > > > > > Cheers > > > > > > > > > > > > > > Michael > > > > > > > > > > > > > > Am 31.07.2011 um 18:59 schrieb Niels Hoogeveen: > > > > > > > > > > > > > > > > > > > > > > > Good point. > > > > > > > > It could for all practical purposes even be > > > Iterable<RelationshipType> > > > > > > so they can be lazily fetched, as long as the underlying > > > implementation > > > > > > makes certain that any iteration of the RelationshipTypes forms a > set > > > (no > > > > > > duplicates). > > > > > > > > There is no need to have RelationshipTypes in any particular > > > order, and > > > > > > if that is needed in the application, they can usually be sorted > > > locally > > > > > > since Nodes will generally have associated Relationships of only > a > > > handful > > > > > > of RelationshipTypes. > > > > > > > > > > > > > > > > That said, the more important question is, if the Neo4j store > can > > > > > > produce this meta-information. For sparsely connected nodes, it > is > > > possible > > > > > > to iterate over the relationships and return the set of > > > RelationshipTypes, > > > > > > but this is not a proper solution when nodes are densely > connected. > > > So there > > > > > > is no general solution for this question yet. > > > > > > > > Niels > > > > > > > > > > > > > > > >> From: j...@neotechnology.com > > > > > > > >> Date: Sun, 31 Jul 2011 17:29:29 +0100 > > > > > > > >> To: user@lists.neo4j.org > > > > > > > >> Subject: Re: [Neo4j] Node#getRelationshipTypes > > > > > > > >> > > > > > > > >> Hi Niels, > > > > > > > >> > > > > > > > >> Ignoring the operational use for getting relationship types, > I > > > do > > > > > > think these should be generalised from: > > > > > > > >> > > > > > > > >>> RelationshipType[] getRelationshipTypes(); > > > > > > > >>> RelationshipType[] getRelationshipTypes(Direction); > > > > > > > >> > > > > > > > >> to: > > > > > > > >> > > > > > > > >> Set<RelationshipType> getRelationshipTypes(); > > > > > > > >> Set<RelationshipType> getgetRelationshipTypes(Direction); > > > > > > > >> > > > > > > > >> Unless you need the ordering and you think the overhead of > > > creating a > > > > > > some kind of Set is too onerous from a performance point of view. > > > > > > > >> > > > > > > > >> Jim > > > > > > > >> _______________________________________________ > > > > > > > >> 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 > > > > > > > > > > > -- > > 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 > -- 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