Angelos, I'm currently at SpringOne and quite swamped, I get back to you as soon as possible.
Michael Am 26.10.2011 um 04:30 schrieb Agelos Pikoulas: > On my previous email please excuse my confusing Person, the example should > clearly be like this : > > * > * > > *@NodeEntity public class Content {}* > * * > > *@NodeEntity public class ExtContent extends Content {}* > > *@NodeEntity > public class Person { > > @RelatedToVia(elementClass = Person.class, type = "LIKES", direction = > Direction.OUTGOING) > private Set<Person> likedPersons; > public Set<Person> getLikedPersons() {return likedPersons;} > > @RelatedToVia(elementClass = Content.class, type = "LIKES", direction = > Direction.OUTGOING) > private Set<Content> likedContent; > public Set<Content> getLikedContent() { return likedContent; } > } > > *I am attaching the code, if someone can github it cause my eclipse plugin > refuses to do so :-(* > * > On Wed, Oct 26, 2011 at 12:54 AM, Agelos Pikoulas <agelos.pikou...@gmail.com >> wrote: > >> Hi to all graphistas, >> >> >> I have two issues, a major and a minor : >> >> 1) 1) Starting with SDG 1.0/1.1, I have been developing a MetaModel >> (and a generator & hopefully later a MetaMetaModel:) and I have been facing >> walls in regards to @NodeEntity / NodeBacked classes inheritance and their >> related @RelatedXXX feature set. >> >> To the specifics, when a @NodeEntity class extends another, there is >> limited support to how these can consistently be related to other nodes >> (and retrieved) based not just on the RelationShip name, but also on their >> class (and inheritance/subclass tree). >> >> >> To better describe things, look at this simplistic example : >> >> I have >> >> @NodeEntity public class Content {} >> >> @NodeEntity public class ExtContent extends Content {} >> >> and >> >> >> @NodeEntity public class Person { >> >> public Set<Person> getLikedPersons() {return >> likedPersons;} >> >> @RelatedToVia(elementClass = Person.class, type = "LIKES", >> direction = Direction.OUTGOING) >> >> private Set<Person> likedPersons; >> >> >> >> public Iterable<Content> getLikedContent() { return >> likedContent; } >> >> @Query ("start n=node({self}) match (n) >> -[:LIKES]-(content) return content") >> >> @RelatedToVia(elementClass = Content.class, type = >> "LIKES", direction = Direction.OUTGOING) >> >> private Iterable<Content> likedContent; >> >> } >> >> >> As you can see, I want Person object/nodes to 'LIKES' other Person objects, >> or Content objects (and below in the inheritance tree, such as ExtContent) : >> >> >> @Test >> public void oo_testing() { >> >> Person p1 = new Person().persist(); >> Person p2 = new Person().persist(); >> Content c1 = new Content().persist(); >> ExtContent c2 = new ExtContent().persist(); >> >> p1.relateTo(c1, "LIKES"); >> p1.relateTo(c2, "LIKES"); >> p1.relateTo(p2, "LIKES"); >> >> for (Content cc : p1.getLikedContent()) >> logger.warn("Class : " + cc.getClass().getName() + ", __type__ >> : " + cc.getPersistentState().getProperty("__type__")); >> >> assertEquals("LikedContent objects are 2", 2, >> p1.getLikedContent().size()); // fails, cause it returns all of 'LIKES' >> related nodes >> >> } >> >> >> In version 1.1.RELEASE, retrieving any of the collections fails at rutime >> (can't recall the Exception, but it was the sort of "wrong class found"). >> >> >> In version 2.0.0.M1 & today's 2.0.0.BUILD-SNAPSHOT, getLikedPersons() & >> getLikedContent() both contain >> >> ALL nodes that are related via 'LIKES' relationship, irrespective of class. >> >> >> >> So, this is what p1.getLikedContent() contains : >> >> >> Class : sdnTests.domain.Content, __type__ : sdnTests.domain.Person >> Class : sdnTests.domain.Content, __type__ : sdnTests.domain.Content >> Class : sdnTests.domain.ExtContent, __type__ : sdnTests.domain.ExtContent >> >> >> One would expect that since elementClass defines the class of nodes to >> fill the collection with, this it would be obeyed. >> >> To a better extend, Iterable<Content> likedContent should contain all >> object/nodes of type Content AND Content subclasses (eg ExtContent), >> >> since do we have this type information. >> >> >> The same lacking of OO/polymorphism exists with repositories, >> >> as discussed here >> http://lists.neo4j.org/pipermail/user/2011-October/012654.html (haven’t >> tested this with 2.0.0.M01, I m still on 1.1) >> >> >> One can overcome these problems by hand & on top of SDN, but I guess it >> wouldn't be very elegant & efficient - I think SDN should inherently allow >> these OO/polymorphic features and emerge itself as a lean & robust OO + >> Graph repository. >> >> 2) 2) The minor issue I have regards (the otherwise brilliant) >> @Query, due to its constraint of annotating (mainly) Iterable and NOT >> allowing Set, List etc (a runtime exception is thrown >> org.springframework.data.neo4j.conversion.QueryResultBuilder$1 cannot be >> cast to java.util.List). >> >> This wouldn’t be a huge problem, but the JSP/JSLT <forEach> tag DOESNOT >> iterate Iterable (!!!), nor you can directly call .iterator() from within >> JSP, making life hard on both ends. >> >> Regards >> > _______________________________________________ > 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