Your thoughts and finding makes a lot of sense and I too would be happy to see those features in the meta model.
2010/4/11 Niels Hoogeveen <pd_aficion...@hotmail.com> > > > > > > > I would be very happy when this functionally is implemented. Let's see who > gets to this first. At the moment I am working on implementing meta model > path expressions that can be used in a traverser, so it may take a couple of > days for me to take a stab at building the instance restriction > functionality. > > I do have another issue with the current implementation. I don't think it's > a good idea to treat relationships and properties on the same footing. There > may be common functionality, but that doesn't make a property the same as a > relationship. > > I think it would be better to have interfaces PropertyRange and > RelationshipRange, and having classes MetaModelProperty and > MetaModelRelationship. Treating properties and relationships as equal, > restricts the modelability of a Neo4J graph. > > As it stands, it is impossible to model the properties of a Relationship. > Within the current design it is not possible to add that functionality, > because it would mean the ability to set MetaModelProperties for > MetaModelProperties. This would be correct for MetaModelProperties that > denote relationships, but not for MetaModelProperties that denote > properties. > > For my own project, I also run into problems that MetaModelProperty is not > specific enough. I'd like to describe paths by means of their meta model > entities. A path would take a form like this: > > MetaModelClass("some class name") --> RelationshipType("some relationship > type name") --> MetaModelClass("some other class name") --> > MetaModelProperty("some property name") > > There are two problems here. First of all, I need to use RelationshipType > as a means to denote a relation. RelationshipType is not part of the meta > model, and as a result has no cardinality information. Without unique names > for PropertyTypes it is impossible to look up the MetaModelProperty a > RelationshipType is related to, since there can be several > MetaModelProperties with the same name. Even if such a lookup were possible, > it is still a clumsy solution. It would be much nicer to be able to have a > class MetaModelRelationship which denotes a relationship, and which has > cardinality and range methods. > > Another issue is that I'd like to be able to state that the final element > in a path is a property of some type. In the end, programs interact with > users and other programs through values, not through objects. So most of the > paths I would like to describe, will end with something that denotes a > property value. Using MetaModelProperty for this purpose, doesn't work, > because MetaModelProperty can denote both a property and a relationship. > > So I think we need three main types of ranges: > > InstanceRange > ClassRanges > PropertyRanges > > Each MetaModelRestrictable now takes a combination of the last two ranges, > and, in my opinion, those should be separated: > > MetaModelProperty (takes PropertyRange and has cardinality methods) > MetaModelRelationship (takes ClassRange or InstanceRange* and has > cardinality methods) > MetaModelClass (takes InstanceRange and has cardinality methods) > > *An InstanceRange on MetaModelRelationship means that each instance of a > class can only have a particular relationship with certain instances. A > class range on MetaModelRelationship means that each instance of a class can > only have a particular relationship with instances of a certain classes. > > > MetaModelClass will additionally have: > > getAllInstances() > getDirectInstances() > getAllPropertyTypes() > getDirectPropertyTypes() > getAllRelationshipsTypes() > getDirectRelationshipsTypes() > getPropertyRestriction(MetaModelProperty, boolean) returns > MetaModelPropertyRestriction > getRelationshipRestriction(MetaModelRelationship, boolean) returns > MetaModelRelationshipRestriction > > MetaModelRelationship will additionally have: > > getAllPropertyTypes() > > getDirectPropertyTypes() > getPropertyRestriction(MetaModelProperty, boolean) returns > MetaModelPropertyRestriction > > > MetaModelProperty needs no additional methods not already covered in the > current implementation. > > Kind regards, > Niels Hoogeveen > > P.S. I think it should be smart to introduce one more entity > MetaModelMetaClass, which I will write about later. > > > > > Date: Fri, 9 Apr 2010 13:36:12 +0200 > > From: matt...@neotechnology.com > > To: user@lists.neo4j.org > > Subject: Re: [Neo] meta meta classes > > > > Now we're getting somewhere... I like this solution a lot, thanks for the > > great idea. Let me see if I get time to try and implement it soon! Or if > you > > get to if before me and supply a patch. It's nice either way :) > > > > 2010/4/9 Niels Hoogeveen <pd_aficion...@hotmail.com> > > > > > > > > Having thought about implementation a little bit more, it would be neat > to > > > have MetaModelClass implement an interface similar to > MetaModelRestrictable, > > > with one difference, the setRange and getRange don't refer to a > > > PropertyRange but to an InstanceRange. > > > > > > Like PropertyRange, InstanceRange should be an abstract class so > several > > > different different implementations of InstanceRanges can be provided: > > > > > > * InstanceEnumerationRange (enumerates the n instances the class > contains > > > and sets minCardinality = maxCardinality = n ) > > > * IndexedInstanceRange (indexes the n instances it contains and sets > > > minCardinality = maxCardinality = n, making the class into an Instance > > > array) > > > * NullInstanceRange (set minCardinality = maxCardinality = 0, making > the > > > class abstract) > > > * InstanceClassesRange (states that the instances of a class have to be > > > instances of one of a given set of classes) > > > > > > The first three range types restrict the MetaModelClass to having no > > > getDirectInstances.add functionality, and also the setting of > cardinality > > > should be disabled, which makes me wonder if we need a class > > > FixedMetaModelClass, which simply doesn't provide these methods, or if > we > > > should throw exceptions when methods are inappropriately called, or if > we > > > allow inconsistent data like the rest of the meta model does. > > > > > > > > > > From: pd_aficion...@hotmail.com > > > > To: user@lists.neo4j.org > > > > Date: Thu, 8 Apr 2010 23:52:02 +0200 > > > > Subject: Re: [Neo] meta meta classes > > > > > > > > > > > > I think the best solution here is to have an instance enumeration on > > > MetaModelClass. Singletons are special case of an enumeration. > > > > > > > > See: > > > > http://www.w3.org/TR/2002/WD-owl-ref-20021112/#Enumerated > > > > > > > > http://owl.cs.manchester.ac.uk/2007/05/api/javadoc/org/semanticweb/owl/model/OWLObjectOneOf.html > > > > > > > > > > > > > > > > > Date: Thu, 8 Apr 2010 22:33:11 +0200 > > > > > From: matt...@neotechnology.com > > > > > To: user@lists.neo4j.org > > > > > Subject: Re: [Neo] meta meta classes > > > > > > > > > > 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 > > > > > > > > _________________________________________________________________ > > > > 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 > > > > > > _________________________________________________________________ > > > 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: Simplify what you do everyday. Find the right PC for you. > 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