[Neo] Fwd: Performance question

Atle Prange atle.prange at gmail.com
Wed Apr 21 19:21:17 CEST 2010


The first draft i have implemented is the wrapper approach:

Entities must subclass NodeWrapper, and typed relations RelationshipWrapper.
These superclasses can get a context set on them, which contains the graph
element they wrap.

I added some helper classes that makes the setting and getting of properties
and relations type safe and less error-prone, but i no longer have my normal
fieldsin my class:

class Person extends NodeWrapper{

    private Value<String> name = Values.property(this,String.class);

    public void setName(String newName){
        name.set(newName);
    }

}


I have the same thing with relations; special classes that entites can use
to express the relations.

I don't like it though, it doesn't "feel right". It makes my entity very
connected to the persistence implementation, i will have to investigate
further, and simplify stuff a bit.

A very interesting sideeffect of using Neo4j as a back-end is its capability
as a RelationshipManager [1]. This is nothing new to you graph-database
guys, but in standard OO, this idea is worth digging into.

If i don't want to pursue the subclass pattern, i have three options left:

1) load/store, which already has been implemented (almost twice).

2) Bytecode manipulation (runtime weaving is hard in felix, therefore i am
stuck with build-time weaving, like Apache Cayenne)

3) Proxying. With this option i have to tell some handler what to store back
to the node when an method is called.
It could look like this:

class Person{

    private String name;

    @Converter(InstantConverter.class)
    private Instant instantOfBirth;

    @Sideffect({"name"})
    public void setName(String newName){
        this.name = newName;
    }

    @Sideffect({"name","instantOfBirth"})
    public void setNameAndInstantOfBirth(String newName,Instant
instantOfBirth){
        this.name = newName;
        this.instantOfBirth = instantOfBirth;
    }


}



Sorry if i am boring you guys, but i think neo4j is the way to go on
persistence...

-atle



[1] http://code.google.com/p/relationship-manager/wiki/PageName






On Wed, Apr 21, 2010 at 3:57 PM, Tobias Ivarsson <
tobias.ivarsson at neotechnology.com> wrote:

> On Wed, Apr 21, 2010 at 2:56 PM, Atle Prange <atle.prange at gmail.com>
> wrote:
>
> > I got the same thing:
> >
> > Here is my answer to your post:
> >
> >
> >        I agree with you completely, and i am trying to get the best of
> >        both worlds. Maybe bytecode manipulation is the only way to
> >        go....
> >
> >        But are you in fact saying that i am implementing an
> >        antipattern, and both jo4neo and neo-persistence use the same
> >        antipattern?
> >
> >
> I assume the pattern you are referring to is the load/store pattern. I
> wouldn't say that it is an anti-pattern, for neo-persistence (worst name
> ever) it is a very valid pattern, since the goal of that component is to
> implement the Java Persistence API (JPA) on Neo4j. For jo4neo it's the way
> it needs to be done because of the way it wants to represent state.
>
> However, the delegating software transactional memory object mapping model
> that we advocate for representing objects, that Anders mentioned earlier in
> this thread, gives you good performance and is easy and convenient to work
> with. It would be interesting if you could take that approach instead,
> since
> jo4neo already fulfills the load/store usecase, but if you have ideas that
> will make your load/store based system better than jo4neo in some aspect, I
> don't want to get in your way, I think you should explore those ideas. I am
> looking forward to hearing about your results.
>
>
> >
> >        A related question on performance. When fetching relations from
> >        a node using Node.getRelatioships(RelationshipType...types), is
> >        the node loading all relationships, and the collecting all of
> >        the given types, or are just the matching relationships loaded?
> >
>
> With the current implementation the answer is "something inbetween", Neo4j
> will look at relationships of more types, but only the ones of the
> specified
> types are actually loaded. This will change in an upcoming version to only
> look at the relationships of the actual specified types.
>
> Cheers,
> --
> Tobias Ivarsson <tobias.ivarsson at neotechnology.com>
> Hacker, Neo Technology
> www.neotechnology.com
> Cellphone: +46 706 534857
> _______________________________________________
> Neo mailing list
> User at lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>


More information about the User mailing list