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

Reply via email to