Hi Peter,
I have given your criticism that the API is too heavy to grasp some more
thought.
I do agree with your assessment that it is heavy to grasp, but don't really
know how to make it simpler.
N-ary edges (Hyperrelationships) are complex beasts compared to Relationships
as defined in the standard Neo4j API.
In another post I already showed how BinaryEdge, as a one-on-one mapping of
Relationship in standard Neo4j API,
is only one of 16 possible two-sided Edges.
This added complexity automatically translates into having to deal with more
classes.
Instead of just Nodes, Relationships and RelationshipTypes, we now have to deal
with:
Vertices, Edges, EdgeTypes, Connectors and ConnectorTypes.
For the n-ary case, there is no other way to deal with this. Of course we could
give things a different name,
as I have done a couple of times now, but no matter how you slice it, when you
want to create an n-ary edge,
you will have to provide the vertices to connect.
Not only do you have to provide these vertices, it is also imperative you tell
where on the edge to place those vertices.
This is relatively simple in the case of a BinaryEdge, where we use the method
Vertex#createEdgeTo(Vertex, RelationshipType).
We only have two Vertices we want to add to the Edge, one of them connecting to
the StartConnector,
the other connecting to the EndConnector. So in this particular case the choice
of Connector can be made implicitly.
With arities > 2 no such implicit choice of Connector can be made, and with
that the entire machinery comes into play.
We will need something akin to EdgeType, because that determines the type of
Connectors available to an Edge.
We need something akin to a Connector, otherwise we don't know were on the Edge
to create a connection.
We also need something akin to an EdgeElement, otherwise we can't create an
Edge in a legal state.
I don't think it's smart to allow the user to create a ternary edge, where only
one or two sides are connected,
just like it's not allowed to create a Relationship in the standard API with
one dangling side.
I am totally open to renaming things, but I don't think it is possible to
really reduce the number of entities involved.
As to the names chosen: Connection, Connector, ConnectorType and ConnectionMode
follows a neat pattern.
There is a Connection, something between a Vertex and an Edge, which is made to
a Connector on that Edge.
That connector has a type, which defines the Mode of that connector/connection.
Initially Connector was named EdgeRole, but that didn't allow the same naming
pattern.
It's possible to have EdgeRole, EdgeRoleType and EdgeRoleMode, but there is no
proper variation on the word EdgeRole
that can be used for the denotation of the connection between a Vertex and an
Edge.
Instead of Connection, Connector, ConnectorType, ConnectorMode,
we could use Association, Associator, AssociatorType, AssociatorMode, but I
don't know if that makes things simpler.
The term EdgeElement is not all the descriptive and I am very much open to
suggestions for a better name.
It's a class we need when creating n-ary edges. There needs to be some method
that creates an Edge,
which should have a signature: createEdge(EdgeType,
SomethingThatAssociatesVerticesWithAConnectorType...);
I have chosen the name EdgeElement instead of
SomethingThatAssociatesVerticesWithAConnectorType,
but I am not all that happy with that name either.
Altogether, n-ary edges are more general than Relationships and with that users
of the API
need to get acquainted with a couple of more concepts that are left implicit
with standard Relationships.
It's simply impossible to generalize Relationships to n-ary edges without
revealing the underlying complexity.
The Wiki page as I have set up now, may need to do more explaining of concepts.
It may be that I moved too quickly, that's the down-side of a one-man-project.
Things that have become self-evident to me over time may be difficult to grasp
for someone new to this model.
So, if there are people that see value in having support for n-ary edges in an
API on top of Neo4j,
please help me out with some of the documentation. A fresh look on things may
be helpful to explain things better.
Niels
> From: [email protected]
> Date: Thu, 11 Aug 2011 20:46:59 +0200
> To: [email protected]
> Subject: Re: [Neo4j] Enhanced API wiki page
>
> Nils,
> interesting approaches! However, IMHO the API is still too heavy to
> grasp with ConnectorType, EdgeElement, EdgeType and Edge being
> involved in creating connections between facts. Is anyone seeing a
> more fluent/concise approach to this? Also, did you have some ideas
> about how to traverse or query these hyperedges?
>
> Cheers,
>
> /peter neubauer
>
> 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://startupbootcamp.org/ - Ă–resund - Innovation happens HERE.
> http://www.thoughtmade.com - Scandinavia's coolest Bring-a-Thing party.
>
>
>
> On Wed, Aug 10, 2011 at 1:19 AM, Niels Hoogeveen
> <[email protected]> wrote:
> >
> > Today I updated the wiki page for Enhanced API. Since the last edit many
> > changes have taken place, so it was to to reflect those changes on the wiki
> > page.
> >
> > See: https://github.com/peterneubauer/graph-collections/wiki/Enhanced-API
> >
> > I also changed what was previously called an "EdgeRole" into a "Connector".
> >
> > Every Edge has a number of Connectors to which Vertices connect.
> >
> > The EdgeType of an Edge defines the ConnectorTypes of the Connectors of an
> > Edge.
> >
> > Each ConnectorType and with that a Connector, has a ConnectionMode, which
> > can be one of these four:
> >
> > Unrestricted: An Edge can connect to an unlimited number of Vertices
> > through a Connector with an unrestricted mode, and a Vertex can have an
> > unlimited number of connected Edges with a ConnectorType with an
> > unrestricted ConnectionMode.
> > Injective: An Edge can connect to only one Vertex through a Connector with
> > injective mode, but a Vertex can have an unlimited number of connected
> > Edges with a ConnectorType with an injective ConnectionMode.
> > Surjective: An Edge can connect to an unlimited number of Vertices through
> > a Connector with a surjective mode, but a Vertex can only have one Edge
> > connected to it with a ConnectorType with a surjective ConnectionMode.
> > Bijective: An Edge can connect to only one Vertex through a Connector with
> > bijective mode, and a Vertex can only have one Edge connected to it with a
> > ConnectorType with a bijective ConnectionMode.
> > All ConnectionModes have been implemented.
> >
> > The switch from EdgeRole to Connector with ConnectionModes has eliminated
> > some of the more annoying type parameters found in the previous incarnation
> > of Enhanced API.
> >
> >
> > _______________________________________________
> > Neo4j mailing list
> > [email protected]
> > https://lists.neo4j.org/mailman/listinfo/user
> >
> _______________________________________________
> Neo4j mailing list
> [email protected]
> https://lists.neo4j.org/mailman/listinfo/user
_______________________________________________
Neo4j mailing list
[email protected]
https://lists.neo4j.org/mailman/listinfo/user