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