I don't understand why you wrapped _all_ the classes, this will make this 
package very brittle as it has to copy all API changes?

I rather thought of a better / fluent / more usable API on top of the existing 
one.

something like

new Graph(gbd).autoIndex("name")
        .node("name","Niels")
        
.relateTo("works_on","repo","graph_collections","language","Java").index("repo","language")
        .node("name","Someone", 
"age",20,"gender",Gender.MALE,"birthday",sdf.parse("01.01.1970"));

int node.getProperty("age", int.class);

etc.

Just convenience for users.

And I don't really understand what property-type is for. I thought you were 
only working on n-ary relationships?

Btw. you can replace those unholy if clauses with polymorphism in the enum.

Are there some tests and/or examples that uses this API ?

Cheers

Michael

Am 23.07.2011 um 21:02 schrieb Niels Hoogeveen:

> 
> Traverser and Index are wrapped too now, so the entire API as can be accessed 
> from GraphDatabaseService is now available in enhanced API version. 
> The API is a drop-in replacement, all that needs to be done to make an 
> application work against the enhanced API, is to change imports.
> 
> From: pd_aficion...@hotmail.com
> To: user@lists.neo4j.org
> Subject: RE: [Neo4j] Hyperedges and Objects
> Date: Fri, 22 Jul 2011 04:00:18 +0200
> 
> 
> 
> 
> 
> 
> 
> 
> I uploaded the first edit (still needs to completely be tested - IS-PRE-ALPHA 
> quality) of the enhanced API.
> 
> See: 
> https://github.com/peterneubauer/graph-collections/tree/master/src/main/java/org/neo4j/collections/graphdb
> 
> The enhanced API has several new features:
> 
> 
> 1.) A new interface RelationshipContainer, supporting createRelation, 
> getRelation,  and hasRelation methods.
> 
> 
> 2.) Relationship implements RelationshipContainer so relationships to and 
> from relationships can be created.
> A relationship property is maintained containing the node ID of an associated 
> node. This node is lazily created (and with that the relationship property is 
> set).
> Relationships are stored on the associated node, while properties are stored 
> on the relationship itself.
> 
> 
> 3.) EnhancedRelationshipType implements RelationshipContainer (and with that 
> PropertyContainer) so RelationshipTypes can have properties and relationships.
> 
> A node associated with a RelationshipType is created lazily. From the 
> reference node a RELTYPE_SUBREF relation points to a node, containing 
> properties corresponding to RelationshipType names. The value of this 
> property is the node ID of the RelationshipType associated node.
> 
> All relationships creation to and from a EnhancedRelationshipType and all 
> properties setting on a EnhancedRelationshipType are performed on the 
> associated node. 
> All retrievals are done from the associated node. 
> 
> The associated node is created the first time it is needed.
> 
> 4.) PropertyType implements RelationshipContainer (and with that 
> PropertyContainer). PropertyTypes can be used in getProperty, setProperty and 
> hasProperty style operations.
> 
> PropertyTypes are parameterized with the datatype of the property. This makes 
> it possible to support methods such as: <T> getPropertyValue(PropertyType) 
> and  setProperty(PropertyType<T>, T) that guard property values added conform 
> to the datatype presumed by the PropertyType and property values are returned 
> typed.
> 
> A node associated with a PropertyType is created lazily. From the reference 
> node a PROPTYPE_SUBREF relation points to a node, which points to nodes per 
> datatype. 
> These datatype related nodes contain properties corresponding to PropertyType 
> names. 
> 
> All relationships creation to and from a PropertyType and all properties 
> setting on a PropertyType are performed on the associated node. All 
> retrievals are done from the associated node. 
> 
> The associated node is created the first time it is needed.
> 
> 5.) GraphDatabaseService allows for the lookup of PropertyTypes and 
> RelationshipTypes and enhanced Nodes and Relationships.
> 
> 
> 6.) Property implements RelationshipContainer (and with that 
> PropertyContainer). //TODO 
> A node associated to a property is created lazily, allowing properties to 
> have relationships and properties. 
> The associated node is created the first time it is needed.
> 
> With these enhancements, all elements of Neo4j (Node, Relationship, 
> RelationshipType, property name and property value) are unified, sharing a 
> common interface RelationshipContainer (and with that PropertyContainer). 
> Node and Relationship also extend their original interfaces, so the API is a 
> drop-in replacement for the original API.
> 
> Both ProperyType and RelatioshipType now provide the necessary methods to 
> implement a type/class system on top of Neo4j, but nothing imposes a 
> type/class system.
> 
> Being able to create Relationships to and from Relationships opens the way to 
> a transparent implementation of n-ary relationships.
> 
> 
> This is all neat, I believe, but I would be really happy if there could be 
> some support in core to hide the implementation a bit more.
> 
> Now:
> 
> 1.) Relationships can have a property containing the node ID of the 
> associated node. This polutes the namespace, so it would be better if there 
> were a setLong and getLong method on Relationship, where the node ID can be 
> stored, keeping the property name away from the property namespace.
> 
> 2.) Named persistent maps from String to PropertyContainer. This would 
> eliminate the REL_SUBREF related node and the PROP_SUBREF related nodes. It 
> would be nice if these enhancements didn't polute the node space. Named 
> persistent maps from String to PropetyContainer would also be helpful for 
> fast lookup of uris and generally for the creation of unique keys.
> 
> Niels
>> Date: Thu, 21 Jul 2011 20:38:15 +0200
>> From: matt...@neotechnology.com
>> To: user@lists.neo4j.org
>> Subject: Re: [Neo4j] Hyperedges and Objects
>> 
>> Niels,
>> 
>> sounds like fun. Looking forward to get a look at this
>> 
>> 2011/7/21 Niels Hoogeveen <pd_aficion...@hotmail.com>
>> 
>>> 
>>> i made a start on this. It's not all too difficult to enhance relationships
>>> such that relationships can be created upon them, which is a first step
>>> towards supporting hypergraphs. In fact hypergraphs are more constrained
>>> than an enhanced graph that supports the creation of relationships on
>>> relationships.
>>> As it stands now, the enhanced graph can work as a drop-in replacement of
>>> the standard neo4j API and has enhanced methods that mirror the standard
>>> methods.
>>> I also added support for typed properties, such that methods like <T>
>>> getPropertyValue<PropertyType<T>> are possible where <T> is one of the data
>>> types supported by PropertyContainer.
>>> I will upload this within the next few days.
>>> Niels
>>> 
>>> 
>>> From: pd_aficion...@hotmail.com
>>> To: user@lists.neo4j.org
>>> Subject: RE: [Neo4j] Hyperedges and Objects
>>> Date: Mon, 18 Jul 2011 17:59:08 +0200
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> I think a hypergraph would be an interesting collection to support in
>>> neo-graph-collections. If I find the time, I will make a start with it this
>>> week, unless there are of course other volunteers :wink: willing to do the
>>> lifting here.
>>> Niels
>>> 
>>>> From: michael.hun...@neotechnology.com
>>>> Date: Sat, 16 Jul 2011 23:37:48 +0200
>>>> To: user@lists.neo4j.org
>>>> Subject: Re: [Neo4j] Hyperedges and Objects
>>>> 
>>>> I completely agree,
>>>> 
>>>> hyperedges and the accompanying traversers should be handled in a
>>> library. As you probably know the traversal framework currently also uses
>>> the core API under the hood to perform the traversals (and no black magic
>>> (yet)).
>>>> 
>>>> So it should be fairly easy to take that approach/code and create a
>>> library that abstracts the hyper-edge issues (creation, deletion,
>>> traversal). The position semantics based approach sounds interesting.
>>>> 
>>>> Would love to see that as community contribution.
>>>> 
>>>> Cheers
>>>> 
>>>> Michael
>>>> 
>>>> Am 16.07.2011 um 23:08 schrieb Niels Hoogeveen:
>>>> 
>>>>> 
>>>>> The question is how much easier a traverser can become when there were
>>> dedicated hyper edges. In a binary relation it is fairly easy to define one
>>> end of the relation as the source and the other as the target (start and end
>>> node),
>>>>> but in n-ary relationships the roles of the attached nodes become more
>>> complicated.
>>>>> 
>>>>> Suppose we have the GIVES relationship, where one attached node takes
>>> the role of subject (the giver),
>>>>> one node takes the role of direct object (the gift), and another node
>>> takes the role of indirect object (the recipient).
>>>>> To traverse such a graph, we need to know these different roles,
>>> otherwise we may end up traversing the wrong nodes.
>>>>> 
>>>>> Suppose we the following statements:
>>>>> 
>>>>> John gives Paul a servant.
>>>>> Paul visited Albania.
>>>>> Paul's servant visited Albania.
>>>>> 
>>>>> We now want to know all people that received a gift from John and who
>>> visited Albania.
>>>>> 
>>>>> Without properly denoting the roles in the ternary relationship stated
>>> by "John gives Paul a servant",
>>>>> the answer to the query may well be: Paul and Paul's servant.
>>>>> Both are persons, both have visited Albania and both are part of the
>>> GIVES relationship defined.
>>>>> 
>>>>> When we have to define the exact roles of each part of an n-ary
>>> relationship for each traversal,
>>>>> it is just as complicated as defining a traversal based on binary
>>> relationships,
>>>>> where different relationship types denote the roles of each part of the
>>> n-ary relationship.
>>>>> 
>>>>> If hyperedges were to be introduced, either as a library or in core,
>>>>> the entire notion of the graph and how traversals are performed need to
>>> be rethought.
>>>>> 
>>>>> The concept of an edge as having a start and an end node doesn't
>>> translate well into the world of hyper edges.
>>>>> There is not necessarily a start node and an end node,
>>>>> instead there are various nodes that are distinctly attached to the
>>> hyper edge.
>>>>> 
>>>>> One way to think about an edge in both the graph and in the hypergraph
>>> world is as a tuple.
>>>>> 
>>>>> A binary relationship can be thought of as the tuple:
>>>>> 
>>>>> (node1, node2, RelationshipType, Set(property))
>>>>> 
>>>>> A ternary relationship can be thought of as the tuple:
>>>>> 
>>>>> (node1, node2, node3, RelationshipType, Set(property))
>>>>> 
>>>>> etc...
>>>>> 
>>>>> Instead of marking a binary relationship as outgoing or incoming, we
>>> can use the position in the tuple to denote its role.
>>>>> We can say the first node in the tuple corresponds to the start node,
>>> and the second node in the tuple corresponds to the end node.
>>>>> Having two possible permutations relates to the two possible directions
>>> an edge can have.
>>>>> 
>>>>> Position based definitions of relationships translate well into the
>>> domain of n-ary relationships,
>>>>> though the semantics of such relationships can easily become difficult.
>>>>> A ternary relationship already has 6 permutations for the attached
>>> nodes,
>>>>> while a 10-ary relationship has 3,628,800 possible permutations.
>>>>> 
>>>>> It would be an interesting project to design a tuple-position-based
>>> traverser.
>>>>> For binary relationships it should have the exact same features as the
>>> current direction based traverser,
>>>>> but it would be possible to generalize that design to n-ary
>>> relationships.
>>>>> This can all be done as a libary.
>>>>> 
>>>>> Only when perfomance can be really improved in core, does it make sense
>>> to request for native support.
>>>>> 
>>>>> Niels
>>>>>> Date: Sat, 16 Jul 2011 19:31:22 +0200
>>>>>> From: ntausc...@gmail.com
>>>>>> To: user@lists.neo4j.org
>>>>>> Subject: Re: [Neo4j] Hyperedges and Objects
>>>>>> 
>>>>>> That's clear. Such mappings are more difficult to traverse since the
>>>>>> traverser has to know if there is such a hyper edge vertex. I'm
>>>>>> wondering if there is no need to provide an embedded solution for such
>>> a
>>>>>> transformation. Each user who is confronted with hyper edges has to
>>>>>> implement some kind of such mapping. It would be helpful, for example,
>>>>>> if each Neo4j relationship can manage hyper edges automatically and
>>>>>> provide an additional 'isHyper' method pointing out that there are
>>>>>> additional methods allowing to get all further incident nodes. This is
>>>>>> also a matter of performance. I think such a handling is implemented
>>>>>> most efficiently within the Neo4j engine.
>>>>>> 
>>>>>> Best regards
>>>>>> 
>>>>>> Norbert Tausch
>>>>>> 
>>>>>> Am 16.07.2011 00:52, schrieb Niels Hoogeveen:
>>>>>>> Hyper edges can be emulated.
>>>>>>> Suppose you want to store the fact "John gives Pete a book".
>>>>>>> This is indeed a ternary relationship, which would call for an hyper
>>> edge.
>>>>>>> This fact can be stored as follows:
>>>>>>> Some act of giving --Giver-->JohnSome act of giving --Recipient-->
>>> PeteSome act of giving --Gift--> book
>>>>>>> N-ary relationships can generally be decomposed into N binary
>>> relationships, where a central node is used to used as a placeholder for the
>>> N-ary relationship.
>>>>>>> Complex types can either be stored into a byte array or if
>>> appropriate in multiple properties.
>>>>>>> 
>>>>>>> 
>>>>>>>> Date: Sat, 16 Jul 2011 00:04:15 +0200
>>>>>>>> From: ntausc...@gmail.com
>>>>>>>> To: user@lists.neo4j.org
>>>>>>>> Subject: [Neo4j] Hyperedges and Objects
>>>>>>>> 
>>>>>>>> Hi,
>>>>>>>> 
>>>>>>>> is there a possibility to store hyper edges in Neo4j? Is there a
>>> plan to
>>>>>>>> implement this?
>>>>>>>> 
>>>>>>>> Will Neo4j get the ability to store complex types in addition to
>>>>>>>> primitve data types for properties of nodes and relationships?
>>>>>>>> 
>>>>>>>> --
>>>>>>>> Best regards
>>>>>>>> 
>>>>>>>> Norbert Tausch
>>>>>>>> 
>>>>>>>> _______________________________________________
>>>>>>>> Neo4j mailing list
>>>>>>>> User@lists.neo4j.org
>>>>>>>> https://lists.neo4j.org/mailman/listinfo/user
>>>>>>> 
>>>>>>> _______________________________________________
>>>>>>> Neo4j mailing list
>>>>>>> User@lists.neo4j.org
>>>>>>> https://lists.neo4j.org/mailman/listinfo/user
>>>>>> _______________________________________________
>>>>>> Neo4j mailing list
>>>>>> User@lists.neo4j.org
>>>>>> https://lists.neo4j.org/mailman/listinfo/user
>>>>> 
>>>>> _______________________________________________
>>>>> Neo4j mailing list
>>>>> User@lists.neo4j.org
>>>>> https://lists.neo4j.org/mailman/listinfo/user
>>>> 
>>>> _______________________________________________
>>>> Neo4j mailing list
>>>> User@lists.neo4j.org
>>>> https://lists.neo4j.org/mailman/listinfo/user
>>> 
>>> _______________________________________________
>>> Neo4j mailing list
>>> User@lists.neo4j.org
>>> https://lists.neo4j.org/mailman/listinfo/user
>>> 
>> 
>> 
>> 
>> -- 
>> Mattias Persson, [matt...@neotechnology.com]
>> Hacker, Neo Technology
>> www.neotechnology.com
>> _______________________________________________
>> Neo4j mailing list
>> User@lists.neo4j.org
>> https://lists.neo4j.org/mailman/listinfo/user
>                                                                               
>   
> _______________________________________________
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user

_______________________________________________
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user

Reply via email to