Hi Peter, I added a Wiki entry in my github repo called "Reification of meta classes and meta properties":
http://wiki.github.com/NielsHoogeveen/Scala-Neo4j-utils/reification-of-meta-classes-and-meta-properties The source code for the Scala wrappers can be found found in my repo: http://github.com/NielsHoogeveen/Scala-Neo4j-utils Kind regards, Niels Hoogeveen > From: neubauer.pe...@gmail.com > Date: Fri, 26 Mar 2010 17:25:01 +0100 > To: user@lists.neo4j.org > Subject: Re: [Neo] meta meta classes > > Awesome Niels! > > maybe you could blog or document some cool example on this? > > Cheers, > > /peter neubauer > > COO and Sales, Neo Technology > > GTalk: neubauer.peter > Skype peter.neubauer > Phone +46 704 106975 > LinkedIn http://www.linkedin.com/in/neubauer > Twitter http://twitter.com/peterneubauer > > http://www.neo4j.org - Your high performance graph database. > http://www.tinkerpop.com - Processing for Internet-scale graphs. > http://www.thoughtmade.com - Scandinavias coolest Bring-a-Thing party. > > > > On Fri, Mar 26, 2010 at 5:22 PM, Niels Hoogeveen > <pd_aficion...@hotmail.com> wrote: > > > > Using Scala, I was actually able to extend MetaModelThing to act as a Node > > and MetaModelClass to have shadowing functionality for both > > MetaModelClasses and for MetaModelProperties, without touching the original > > source code. > > > >> To: user@lists.neo4j.org > >> From: rick.bullo...@burningskysoftware.com > >> Date: Fri, 26 Mar 2010 14:29:03 +0000 > >> Subject: Re: [Neo] meta meta classes > >> > >> Such are the joys and challenges of frameworks and abstractions. > >> Sometimes you do need to get "close to the metal" though, to achieve > >> specific functional and performance requirements. Thus the reason open > >> source frameworks are awesome. At least we can change and extend them > >> more easily! > >> > >> > >> > >> -----Original Message----- > >> From: Niels Hoogeveen <pd_aficion...@hotmail.com> > >> Date: Fri, 26 Mar 2010 15:20:15 > >> To: <user@lists.neo4j.org> > >> Subject: Re: [Neo] meta meta classes > >> > >> > >> Making MetaModelThing implement the Node interface is actually orthogonal > >> to the creation of Shadow objects. Though it does make code using classes > >> as objects cleaner, and allows the node property of MetaModelThing to > >> become private. > >> > >> > From: pd_aficion...@hotmail.com > >> > To: user@lists.neo4j.org > >> > Date: Fri, 26 Mar 2010 14:38:08 +0100 > >> > Subject: Re: [Neo] meta meta classes > >> > > >> > > >> > Or, and this probably the simplest solution. Let a MetaModelThing > >> > implement the Node interface. This allows a class to be an instance of > >> > another class and/or a SubType of another class. > >> > > >> > > >> > > From: pd_aficion...@hotmail.com > >> > > To: user@lists.neo4j.org > >> > > Date: Fri, 26 Mar 2010 14:20:07 +0100 > >> > > Subject: Re: [Neo] meta meta classes > >> > > > >> > > > >> > > The class as object phenomenon is actually quite pervasive, and I > >> > > think it is possible to have a generalized solution for it. > >> > > > >> > > After sending this email yesterday, I came up with a slightly > >> > > different solution. > >> > > > >> > > val taggable = namespace.getMetaClass("taggable", true) > >> > > > >> > > val tagName = metaModelNamespace.getMetaProperty("tagname", true) > >> > > tagName.setCardinality(1) > >> > > > >> > > val metaTaggable = metaModelNamespace.getMetaClass("taggable", true) > >> > > metaTaggable.getDirectProperties.add(tagName) > >> > > metaTaggable.getDirectInstances.add(taggable.node) > >> > > > >> > > val body = namespace.getMetaClass("body", true) > >> > > taggable.getDirectSubs.add(body) > >> > > > >> > > Instead of directly relating the class "body" to the meta class > >> > > "taggable", I create a shadow of the meta class "taggable" with the > >> > > same name in the namespace of the class "body", and make "body" a > >> > > subclass of this shadow. That way the sub classing relationship > >> > > remains nicely in one name space, while the instance relationship > >> > > transcends name spaces, as it should. > >> > > > >> > > This could in principle be generalized by adding a methods to > >> > > MetaModelClass: > >> > > > >> > > public MetaModelClass createShadowClass(NameSpace ns){ > >> > > > >> > > MetaModelClass mc = ns.getMetaClass(this.getName(), true); > >> > > this.getDirectInstances.add(mc.node); > >> > > return mc; > >> > > } > >> > > > >> > > This returns a shadow of a given MetaModelClass in a given namespace > >> > > and adds it as a an instance of this. > >> > > > >> > > It would of course be nicer to have a method with the signature: > >> > > > >> > > public MetaModelClass getShadow(NameSpace ns, Boolean create) > >> > > > >> > > This is much more in line with the rest of the API, but requires a way > >> > > to find out the namespace a given MetaModelClass is defined in. I > >> > > didn't see a method getNamespace() for a given class, and didn't delve > >> > > deeply enough in the source code to figure out how to do that. > >> > > > >> > > A similar approach can of course also be applied to > >> > > MetaModelProperties, by adding the following method to MetaModelClass: > >> > > > >> > > public MetaModelProperty > >> > > createShadowProperty(NameSpace ns){ > >> > > > >> > > > >> > > > >> > > MetaModelProperty mp = > >> > > ns.getMetaProperty(this.getName(), true); > >> > > > >> > > > >> > > this.getDirectInstances.add(mp.node); > >> > > > >> > > return mp; > >> > > > >> > > } > >> > > > >> > > > >> > > This way the underlying node of a MetaModelProperty can properly be > >> > > used as a class of its own and have properties, relationships, that > >> > > can be further modeled in the meta layer. This e.q. allows to set a > >> > > default rendering format for a given property class. > >> > > > >> > > I don't see a MetaModelRelationships, which is unfortunate, since that > >> > > would allow the modeling of the properties of a Relationship. > >> > > > >> > > > >> > > Kind regards, > >> > > Niels Hoogeveen > >> > > > >> > > > >> > > > Date: Fri, 26 Mar 2010 11:26:29 +0100 > >> > > > From: matt...@neotechnology.com > >> > > > To: user@lists.neo4j.org > >> > > > Subject: Re: [Neo] meta meta classes > >> > > > > >> > > > That's an interresting case you've got here and it looks to me like > >> > > > it's > >> > > > probably the best way to model it in the meta model. > >> > > > > >> > > > 2010/3/25 Niels Hoogeveen <pd_aficion...@hotmail.com> > >> > > > > >> > > > > > >> > > > > For my application, I want to model an HTML template in Neo4J, > >> > > > > using the > >> > > > > MetaModel api. > >> > > > > > >> > > > > So I started setting up MetaModelClasses for the various HTML > >> > > > > entities. > >> > > > > > >> > > > > e.g. (code in Scala) > >> > > > > > >> > > > > val classProp = namespace.getMetaProperty("class", true) > >> > > > > val idProp = > >> > > > > namespace.getMetaProperty("id", true) > >> > > > > idProp.setCardinality(1) > >> > > > > > >> > > > > > >> > > > > val body = namespace.getMetaClass("body", true) > >> > > > > body.getDirectProperties(classProp) > >> > > > > body.getDirectProperties(idProp) > >> > > > > > >> > > > > > >> > > > > Which creates a class named "body" which has a property named > >> > > > > "class" > >> > > > > without a cardinality restriction and a property named "id" with a > >> > > > > cardinality restriction of 1. > >> > > > > > >> > > > > Now I can create nodes of class "body" with various values for > >> > > > > "class" and > >> > > > > for "id". > >> > > > > > >> > > > > So far so good, but now I want to say that the class body has a > >> > > > > property > >> > > > > "tagname" which should get the value "body". > >> > > > > > >> > > > > The meta model itself doesn't allow classes to have properties, > >> > > > > but it > >> > > > > allows access to the underlying node of the class. > >> > > > > > >> > > > > So I created a separate namespace for the meta meta classes and > >> > > > > added the > >> > > > > following three definitions: > >> > > > > > >> > > > > val tagName = metaNamespace.getMetaProperty("tagname", true) > >> > > > > tagName.setCardinality(1) > >> > > > > val taggable = metaNamespace.getMetaClass("taggable", true) > >> > > > > > >> > > > > body.node.setProperty("tagname", "body") > >> > > > > > >> > > > > This creates a property "tagname" with the value "body" for the > >> > > > > class named > >> > > > > "body". > >> > > > > > >> > > > > Now comes the more ambiguous part, how to link "body" to > >> > > > > "taggable". > >> > > > > > >> > > > > I can make body.node an instance of taggable. Once there is a > >> > > > > validator, > >> > > > > the existence of a "tagname" property with cardinality 1 should be > >> > > > > checked, > >> > > > > so it is reasonable to make body.node an instance of taggable. > >> > > > > > >> > > > > At the same time the class body is actually a subclass of > >> > > > > taggable, so I am > >> > > > > inclined to define that as well. > >> > > > > > >> > > > > So I end up doing the following: > >> > > > > > >> > > > > taggable.getDirectInstances.add(body.node) > >> > > > > taggable.getDirectSubs.add(body) > >> > > > > > >> > > > > I would like to know if this is the correct approach to this > >> > > > > situation, or > >> > > > > whether there are better alternatives. > >> > > > > > >> > > > > Kind regards, > >> > > > > Niels Hoogeveen > >> > > > > > >> > > > > > >> > > > > _________________________________________________________________ > >> > > > > New Windows 7: Find the right PC for you. Learn more. > >> > > > > http://windows.microsoft.com/shop > >> > > > > _______________________________________________ > >> > > > > Neo mailing list > >> > > > > User@lists.neo4j.org > >> > > > > https://lists.neo4j.org/mailman/listinfo/user > >> > > > > > >> > > > > >> > > > > >> > > > > >> > > > -- > >> > > > Mattias Persson, [matt...@neotechnology.com] > >> > > > Neo Technology, www.neotechnology.com > >> > > > _______________________________________________ > >> > > > Neo mailing list > >> > > > User@lists.neo4j.org > >> > > > https://lists.neo4j.org/mailman/listinfo/user > >> > > > >> > > _________________________________________________________________ > >> > > Express yourself instantly with MSN Messenger! Download today it's > >> > > FREE! > >> > > http://messenger.msn.click-url.com/go/onm00200471ave/direct/01/ > >> > > _______________________________________________ > >> > > Neo mailing list > >> > > User@lists.neo4j.org > >> > > https://lists.neo4j.org/mailman/listinfo/user > >> > > >> > _________________________________________________________________ > >> > New Windows 7: Find the right PC for you. Learn more. > >> > http://windows.microsoft.com/shop > >> > _______________________________________________ > >> > Neo mailing list > >> > User@lists.neo4j.org > >> > https://lists.neo4j.org/mailman/listinfo/user > >> > >> _________________________________________________________________ > >> New Windows 7: Find the right PC for you. Learn more. > >> http://windows.microsoft.com/shop > >> _______________________________________________ > >> Neo mailing list > >> User@lists.neo4j.org > >> https://lists.neo4j.org/mailman/listinfo/user > >> _______________________________________________ > >> Neo mailing list > >> User@lists.neo4j.org > >> https://lists.neo4j.org/mailman/listinfo/user > > > > _________________________________________________________________ > > New Windows 7: Find the right PC for you. Learn more. > > http://windows.microsoft.com/shop > > _______________________________________________ > > Neo mailing list > > User@lists.neo4j.org > > https://lists.neo4j.org/mailman/listinfo/user > > > _______________________________________________ > Neo mailing list > User@lists.neo4j.org > https://lists.neo4j.org/mailman/listinfo/user _________________________________________________________________ Express yourself instantly with MSN Messenger! Download today it's FREE! http://messenger.msn.click-url.com/go/onm00200471ave/direct/01/ _______________________________________________ Neo mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user