Ok now I get your point! Thank you for clarifying. Your singleton proposal could be a good idea then. Could it potentially be a hindrance in some scenario? I mean should we have a MetaModelClass#setSingleton(boolean) or something so that this behaviour can be controlled?
2010/4/8, Niels Hoogeveen <pd_aficion...@hotmail.com>: > > Each country needs to be modeled as classes, because I want to set the > restriction that French regions (which can have different properties from > Canadian provinces) can only have a relationship with the country France, > and Canadian provinces can only have a relationship with the country Canada. > The domain and the range of a PropertyType are classes not instances. If > countries were simply instances of the "country" class, it would be > possible to say that an instance of a Canadian province is a subdivision of > France. > > I'd like to be able to iterate over the subdivision of France and have > guaranteed that each instance has the property "region code", a property > unknown to Canadian provinces. Without having a restriction stating that a > specific sub-division belongs to a specific country, any sub-division can be > related to any country, so a user may erroneously say that Alberta is a > French region. Not only is this factually incorrect, but structurally too. > Alberta, being a Canadian province, doesn't have the "region code" property, > which I want French regions to have. > > >> Date: Thu, 8 Apr 2010 20:06:32 +0200 >> From: matt...@neotechnology.com >> To: user@lists.neo4j.org >> Subject: Re: [Neo] meta meta classes >> >> 2010/4/8 Niels Hoogeveen <pd_aficion...@hotmail.com> >> >> > >> > Your point about the cardinality restriction is a correct observation. >> > >> > In fact it would be better to create a "is-subdivision-of" PropertyType >> > on >> > "sub-division" and give that a range "country" with a cardinality of 1. >> > Then >> > for each subclass of "sub-division" a restriction should be set, naming >> > the >> > "country" class this specific "sub-division" class applies to. >> > >> > Still, it requires each country to be defined as both a class and an >> > instance. >> > >> Why just countries as classes? why not each subdivision as classes as >> well? >> Why countries as classes at all? >> >> > >> > > Date: Thu, 8 Apr 2010 19:15:30 +0200 >> > > From: matt...@neotechnology.com >> > > To: user@lists.neo4j.org >> > > Subject: Re: [Neo] meta meta classes >> > > >> > > So, you describe the model (with "country", "sub-division" and >> > > "has-sub-division") which is OK! Then you not just want to add data >> > > which >> > > would conform to it, you also describe the highest level of that data >> > > in >> > the >> > > meta model itself with cardinality for how many sub-divisions each >> > > such >> > > level must contain. >> > > >> > > My first though here is: why put actual data into the meta model (the >> > design >> > > isn't intended for that)? >> > > The second is: why (since you put actual data into the meta model) >> > > would >> > you >> > > stop there? why only say that "France" have 10 subdivisions? You don't >> > say >> > > exactly which subdivisions or how many/which subdivisions each >> > subdivision >> > > has, a.s.o. Which benefits would modeling only the highest level of >> > > data >> > get >> > > you? And if you could describe the entire data in the meta model, you >> > > end >> > up >> > > with a meta model which describes the entire data and then, in >> > > addition, >> > the >> > > data which is exactly the same as the meta model... what benefits does >> > that >> > > give you? >> > > >> > > I'm just confused about the fact that you want to have the meta model >> > > (classes, properties, restrictions) and (some of) the actual data >> > > modeled >> > in >> > > the meta model, whereas the meta model was intended to model the meta >> > model >> > > (the UML diagram, so to speak) and not the actual data it would have >> > conform >> > > to it. >> > > >> > > Help me understand which benefits you're after by modeling the "top >> > level" >> > > of your actual data into the meta model itself. >> > > >> > > >> > > Best, >> > > Mattias >> > > >> > > 2010/4/8 Niels Hoogeveen <pd_aficion...@hotmail.com> >> > > >> > > > >> > > > The example of the tag library and countries/sub-divisions are not >> > > > necessarily similar. The first shows the need to model the >> > > > properties >> > of a >> > > > class. >> > > > >> > > > The second example shows the need to have singleton classes, which >> > > > is a >> > > > different concept, and something that cannot be done out of the box, >> > but I >> > > > will show a solution that requires minimal modifications to the >> > > > current >> > > > software. >> > > > >> > > > Suppose we want to model "countries" and their "sub-divisions". >> > > > >> > > > We do the following: >> > > > >> > > > create class "country" >> > > > create class "sub-division" >> > > > create property "has-sub-division" >> > > > make "has-subdivision" a property of "country" >> > > > >> > > > Now we like to populate the database, since all countries have >> > different >> > > > types of sub-divisions we need to create those: >> > > > >> > > > create class "french_region" >> > > > create class "canadian_province" >> > > > create class "canadian_territory" >> > > > create class "US_state" >> > > > etc. >> > > > >> > > > Populate the various classes with instances: >> > > > >> > > > create node for "Alsace" and make it an instance of "french_region" >> > > > create node for "Aquitaine" and make it an instance of >> > > > "french_region" >> > > > create node for "Alberta" and make it an instance of >> > > > "Canadian_province" >> > > > create node for "Nanavut" and make it an instance of >> > > > "Canadian_territory" >> > > > create node for "British Columbia" and make it an instance of >> > > > "Canadian_province" >> > > > create node for "Alabama" and make it an instance of >> > > > "US_State" >> > > > create node for "Alaska" and make it an instance of >> > > > "US_State" >> > > > etc. >> > > > >> > > > We'd like to state that each country has its own restriction on the >> > type of >> > > > subdivision. To do that we need to create classes for each country. >> > > > >> > > > create class "France" >> > > > create class "Canada" >> > > > create class "United_States_of_America" >> > > > etc. >> > > > >> > > > make class "France" a subclass of "Country" >> > > > make class "Canada" a subclass of "Country" >> > > > make class "United_States_of_America" a subclass of "Country" >> > > > etc. >> > > > >> > > > create restriction for "France" on "has-sub-division" with range >> > > > "french_province" and cardinality = 26 >> > > > create restriction for "Canada" on "has-sub-division" with range >> > > > "canadian_province" and cardinality = 10 >> > > > create restriction for "Canada" on "has-sub-division" with range >> > > > "canadian_territory" and cardinality = 3 >> > > > create restriction for "United_States_of_America" on >> > > > "has-sub-division" >> > > > with range "US_State" and cardinality = 50 >> > > > etc. >> > > > >> > > > Now we have classes for each country, but no instances. >> > > > Unfortunately >> > we >> > > > cannot say that a class is an instance of itself, that would require >> > > > a >> > > > relationsship where the endnode equals the startnode, which Neo4J >> > doesn't >> > > > allow. So we have to create separate instances for each country. >> > > > >> > > > create node for "France" >> > > > create node for "Canada" >> > > > create node for "United_States_Of_America" >> > > > etc. >> > > > >> > > > make node "France" an instance of class "France" >> > > > make node "Canada" an instance of class "Canada" >> > > > make node "United_States_of_America" an instance of class >> > > > "United_States_of_America" >> > > > >> > > > And finally link the subdivisions to their countries: >> > > > >> > > > "France" "has-sub-division" "Alsace" >> > > > "France" "has-sub-division" "Aquitaine" >> > > > "Canada" "has-sub-division-of" "Alberta" >> > > > "Canada" "has-subdivision" "British Columbia" >> > > > "Canada" "has-subdivision" "Nanavut" >> > > > "United_States_of_America" "has-sub-division" "Alabama" >> > > > "United_States_of_America" "has-sub-division" "Alaska" >> > > > >> > > > So we end up having a class for each country and an instance for >> > > > each >> > > > country. >> > > > >> > > > Writing this down, I realize the patch I sent you a few days ago, >> > contains >> > > > a minor flaw, that needs to be fixed. In that patch I added an >> > > > indexed >> > > > property "uri" to the meta model, to bring it in line with what is >> > being >> > > > done in the RDF module, and to make certain that the same URI is not >> > used >> > > > for two different properties. Without unicity a class can have >> > > > several >> > > > different ProperyTypes with the same name. In that situation the >> > > > lookup >> > of >> > > > the PropertyType of a property or relationship becomes impossible. >> > > > >> > > > The flaw in my patch is the name of the "uri" property, which should >> > > > be >> > > > something like "class_uri". That way the class of each country can >> > > > be >> > given >> > > > the same URI as the instance of each country, because they live in >> > different >> > > > name spaces. >> > > > >> > > > This same technique is used in OWL to provide "punning". An instance >> > and a >> > > > class can have the same URI, because instances in OWL live in a >> > different >> > > > namespaces from classes. >> > > > >> > > > Through the use of the "uri" property and the "class_uri" property >> > > > we >> > can >> > > > also distill that each country class is a singleton class, because >> > there >> > > > exists an instance with the same URI. That way we can work around >> > > > the >> > > > limitation that relationships cannot have the same start and end >> > > > node. >> > > > >> > > > Furthermore, it allows for some extra restrictions to MetaModelClass >> > with >> > > > the following logic: If a class has exactly one instance where the >> > "uri" of >> > > > that instance equals the "class_uri" of the class, no more instances >> > can be >> > > > added And if there is an instance of a class without a "uri" that >> > equals the >> > > > "class_uri", no instances can be added where the "uri" of the >> > > > instance >> > > > equals the "class_uri" of the class. With that logic, we have proper >> > > > singleton classes in the meta model of Neo4J. >> > > > >> > > > Kind regards, >> > > > Niels Hoogeveen >> > > > >> > > > > Date: Thu, 8 Apr 2010 11:37:37 +0200 >> > > > > From: matt...@neotechnology.com >> > > > > To: user@lists.neo4j.org >> > > > > Subject: Re: [Neo] meta meta classes >> > > > > >> > > > > 2010/3/30 Niels Hoogeveen <pd_aficion...@hotmail.com> >> > > > > >> > > > > > >> > > > > > MetaModelObject already has a getter (without using the word >> > > > > > "get") >> > to >> > > > > > access the node. >> > > > > > >> > > > > > Wrapping MetaModelObject to give it a Node-interface makes it >> > possible >> > > > to >> > > > > > directly write: >> > > > > > >> > > > > > metalObject.setProperty("a", b) >> > > > > > >> > > > > > instead of >> > > > > > >> > > > > > metaobject.node.setPropert("a", b) >> > > > > > >> > > > > > If that were all, I wouldn't make a post about it. The more >> > interesting >> > > > > > part is the meta modeling of the node gotten from a >> > MetaModelObject. >> > > > This >> > > > > > node represents the class, but it is not an instance of any >> > > > > > class >> > > > itself. >> > > > > > That's where the reify method comes into play, which takes the >> > > > > > node >> > > > from a >> > > > > > MetaModelObject and creates a class with the same name, but in a >> > > > different >> > > > > > namespace, and makes the node an instance of this new class. >> > > > > > >> > > > > > With that construction it becomes possible to model the >> > > > > > relationships/properties of a class. >> > > > > > >> > > > > > There are many examples where this can be handy. >> > > > > > >> > > > > > I already gave the example of HTML tags, where the attributes >> > > > > > can >> > be >> > > > > > modeled as properties and the tagname as a property of the meta >> > class. >> > > > > > >> > > > > > Another example is: >> > > > > > >> > > > > > All countries have subdivision. Countries and their subdivisions >> > all >> > > > are >> > > > > > instances of a certain class. There is one class for country, >> > > > > > but >> > there >> > > > is a >> > > > > > set of classes for subdivisions. In some countries, a >> > > > > > subdivision >> > is >> > > > called >> > > > > > "province", in others it's a "state" or a "district". >> > > > > > Subdivision >> > of >> > > > various >> > > > > > countries can have different sets of properties and relations. >> > > > > > >> > > > > > How to model the fact that the instance "United States of >> > > > > > America" >> > has >> > > > > > subdivisions of the class "State_(US)"? Using the reify method >> > > > > > we >> > can >> > > > make a >> > > > > > class "United States of America", where we can model that the >> > > > ClassRange of >> > > > > > "State_(US)" is "United States of America". Or if we want the >> > > > relationship >> > > > > > to point the other way, that the "United States of America" has >> > > > > > 50 >> > (use >> > > > of >> > > > > > cardinality) subdivisions of the class "State_(US)". >> > > > > > >> > > > > Here you take a step into modeling the actual data into the meta >> > model >> > > > which >> > > > > describes the data. Is it desirable to first model exactly how the >> > data >> > > > will >> > > > > look, and then add data so that it looks like that? I get a >> > > > > feeling >> > that >> > > > the >> > > > > data is described twice here... >> > > > > >> > > > > > >> > > > > > Of course all this can directly be expressed with nodes and >> > > > relationships, >> > > > > > but that's what the meta model does anyway. >> > > > > > >> > > > > > I do have one peeve with the meta model API. The class DataRange >> > has a >> > > > > > constructor: >> > > > > > >> > > > > > DataRange(String datatype, Object... values) >> > > > > > >> > > > > > I'd much rather see a new Restrictable class Datavalue, and see >> > > > > > a >> > > > > > constructor: >> > > > > > >> > > > > > DataRange(String datatype, Datavalue... values) >> > > > > > >> > > > > > That way the possible values a property can have additional >> > properties >> > > > and >> > > > > > relationships (eg. link to Wordnet definition or Wikipedia >> > > > > > entry). >> > > > > > >> > > > > > Kind regards, >> > > > > > Niels Hoogeveen >> > > > > > >> > > > > > >> > > > > > >> > > > > > >> > > > > > >> > > > > > >> > > > > > > Date: Tue, 30 Mar 2010 09:30:10 +0200 >> > > > > > > From: matt...@neotechnology.com >> > > > > > > To: user@lists.neo4j.org >> > > > > > > Subject: Re: [Neo] meta meta classes >> > > > > > > >> > > > > > > Would making the underlying Node publically available (via a >> > getter) >> > > > be >> > > > > > > virtually the same thing? In that case the meta model classes >> > could >> > > > have >> > > > > > > such a getter. >> > > > > > > >> > > > > > > 2010/3/26 Niels Hoogeveen <pd_aficion...@hotmail.com> >> > > > > > > >> > > > > > > > >> > > > > > > > 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 >> > > > > > > > >> > > > > > > >> > > > > > > >> > > > > > > >> > > > > > > -- >> > > > > > > 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 >> > > > > > >> > > > > >> > > > > >> > > > > >> > > > > -- >> > > > > Mattias Persson, [matt...@neotechnology.com] >> > > > > Hacker, 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 >> > > > >> > > >> > > >> > > >> > > -- >> > > Mattias Persson, [matt...@neotechnology.com] >> > > Hacker, Neo Technology >> > > www.neotechnology.com >> > > _______________________________________________ >> > > 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 >> > >> >> >> >> -- >> Mattias Persson, [matt...@neotechnology.com] >> Hacker, 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 > -- Mattias Persson, [matt...@neotechnology.com] Hacker, Neo Technology www.neotechnology.com _______________________________________________ Neo mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user