Re: [Neo4j] n-ary relationships

2011-08-15 Thread Niels Hoogeveen

Hi Emerson,

Over the last couple of weeks, I have been working on an implementation of 
n-ary relationships on top of Neo4j. I also detailed how n-ary relationships 
could in principle be implemented in the database kernel (see: 
http://lists.neo4j.org/pipermail/user/2011-August/011191.html).

Right now I am working on traversals for n-ary relationships, in an attempt to 
remove the unnaturalness you describe.

If we look at your example and using the nomenclature of Enhanced-API, you'd 
have an EdgeType "REFERS" with three ConnectorsTypes: "Referrer", "Referree", 
"Course", such that we can create the following Egde:

REFERS
Referrer --paul
Referree -- john
Course -- history 

A traversal takes as input a Vertex (strictly speaking a Traversal, of which a 
Vertex is a subclass), and takes two ConnectorTypes to traverse from a Vertex 
to an Edge to a Vertex.

So if you want to know the Referrers for the course "history", the traversal 
would be defined like:

//create a traversal description
TraversalDescription descr = TraversalDescription.add(Course, Referrer)

//traverse  the graph based on the description starting from the vertex 
"history"
descr.traverse(history)

Ther traverse method returns a Iterable, which in this case contains only 
one Path. The path consists of two Connections, (history, Course) and (paul, 
Referrer).

I hope this somehow answers your question.

Niels

> Date: Sun, 14 Aug 2011 18:57:22 +0200
> From: emerson.farru...@gmail.com
> To: user@lists.neo4j.org
> Subject: [Neo4j] n-ary relationships
> 
> Hi,
> 
> I started looking into Neo4j this morning, and played with some domain
> models to see whether it really passes a "whiteboard friendliness" test. I'm
> really after a persistence solution that makes it straightforward to persist
> a domain model designed from a DDD perspective, and Neo4j is looking
> promising so far. The one aspect that's not too clear is how to model n-ary
> relationships, and I'm curious as to how those of you with experience with
> Neo4j and graph databases would approach it.
> 
> An edge connects two vertices, so in a graph database, a relationship
> connects two nodes. But when modeling, there are frequently relationships
> between multiple entities. For example, student John attends a History
> course at university, and John was referred to the History course by Paul.
> This relationship relates John, Paul, and the History course.
> 
> There are a few ways I can think of to model this.
> 
> 1) A node John has an ATTENDS relationship with node History, and the
> relationship has a "referrer" property with Paul's ID. Simple, but keeping
> IDs as properties seems like an anti-pattern.
> 2) A node Referral has a CREATED_BY relationship with node Paul,
> a FOR_COURSE relationship with node History, and a TO_STUDENT relationship
> with node John. It's effectively a three-way join.
> 3) Same as 2, but with an additional ATTENDS relationship between John and
> History. This is particularly useful if a course attendant may attend a
> course without being referred.
> 
> This might not be the best example in the world, but it should drive my
> point home: when relationships have a degree higher than 2, relationships
> need to be modelled as vertices to overcome the binary nature of edges. Is
> this expected behavior that's part and parcel of graph databases, or am I
> approaching the modeling incorrectly somehow?
> 
> My concern is that traversals may become unnatural when this happens. Say I
> want to iterate over the attendants of a course, and show the name of who
> referred them when I do so. Will I have the graph database equivalent of n+1
> selects because the data I want to extract (referrer name) is in a different
> node (Paul) to my node of interest (John), instead of in the relationship to
> it (attends)?
> 
> Any tips and opinions would be appreciated.
> 
> Cheers,
> Emerson
> ___
> 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


Re: [Neo4j] n-ary relationships

2011-08-14 Thread Peter Neubauer
Hi Emerson,
There is www.qi4j.org trying to implement DDD concepts in Java, with Neo4j
as a backend, just FYI.

As for hyperedges or N-ary relationships, Nils is right now looking at a
good API and implementation on top, and partly below, the neo4j core API.
The current status is reflected at
https://github.com/peterneubauer/graph-collections/wiki/Enhanced-API

Is this along the lines you are thinking? Feedback is most appreciated!

/peter

Sent from my phone.
On Aug 14, 2011 6:57 PM, "Emerson Farrugia" 
wrote:
> Hi,
>
> I started looking into Neo4j this morning, and played with some domain
> models to see whether it really passes a "whiteboard friendliness" test.
I'm
> really after a persistence solution that makes it straightforward to
persist
> a domain model designed from a DDD perspective, and Neo4j is looking
> promising so far. The one aspect that's not too clear is how to model
n-ary
> relationships, and I'm curious as to how those of you with experience with
> Neo4j and graph databases would approach it.
>
> An edge connects two vertices, so in a graph database, a relationship
> connects two nodes. But when modeling, there are frequently relationships
> between multiple entities. For example, student John attends a History
> course at university, and John was referred to the History course by Paul.
> This relationship relates John, Paul, and the History course.
>
> There are a few ways I can think of to model this.
>
> 1) A node John has an ATTENDS relationship with node History, and the
> relationship has a "referrer" property with Paul's ID. Simple, but keeping
> IDs as properties seems like an anti-pattern.
> 2) A node Referral has a CREATED_BY relationship with node Paul,
> a FOR_COURSE relationship with node History, and a TO_STUDENT relationship
> with node John. It's effectively a three-way join.
> 3) Same as 2, but with an additional ATTENDS relationship between John and
> History. This is particularly useful if a course attendant may attend a
> course without being referred.
>
> This might not be the best example in the world, but it should drive my
> point home: when relationships have a degree higher than 2, relationships
> need to be modelled as vertices to overcome the binary nature of edges. Is
> this expected behavior that's part and parcel of graph databases, or am I
> approaching the modeling incorrectly somehow?
>
> My concern is that traversals may become unnatural when this happens. Say
I
> want to iterate over the attendants of a course, and show the name of who
> referred them when I do so. Will I have the graph database equivalent of
n+1
> selects because the data I want to extract (referrer name) is in a
different
> node (Paul) to my node of interest (John), instead of in the relationship
to
> it (attends)?
>
> Any tips and opinions would be appreciated.
>
> Cheers,
> Emerson
> ___
> 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] n-ary relationships

2011-08-14 Thread Emerson Farrugia
Hi,

I started looking into Neo4j this morning, and played with some domain
models to see whether it really passes a "whiteboard friendliness" test. I'm
really after a persistence solution that makes it straightforward to persist
a domain model designed from a DDD perspective, and Neo4j is looking
promising so far. The one aspect that's not too clear is how to model n-ary
relationships, and I'm curious as to how those of you with experience with
Neo4j and graph databases would approach it.

An edge connects two vertices, so in a graph database, a relationship
connects two nodes. But when modeling, there are frequently relationships
between multiple entities. For example, student John attends a History
course at university, and John was referred to the History course by Paul.
This relationship relates John, Paul, and the History course.

There are a few ways I can think of to model this.

1) A node John has an ATTENDS relationship with node History, and the
relationship has a "referrer" property with Paul's ID. Simple, but keeping
IDs as properties seems like an anti-pattern.
2) A node Referral has a CREATED_BY relationship with node Paul,
a FOR_COURSE relationship with node History, and a TO_STUDENT relationship
with node John. It's effectively a three-way join.
3) Same as 2, but with an additional ATTENDS relationship between John and
History. This is particularly useful if a course attendant may attend a
course without being referred.

This might not be the best example in the world, but it should drive my
point home: when relationships have a degree higher than 2, relationships
need to be modelled as vertices to overcome the binary nature of edges. Is
this expected behavior that's part and parcel of graph databases, or am I
approaching the modeling incorrectly somehow?

My concern is that traversals may become unnatural when this happens. Say I
want to iterate over the attendants of a course, and show the name of who
referred them when I do so. Will I have the graph database equivalent of n+1
selects because the data I want to extract (referrer name) is in a different
node (Paul) to my node of interest (John), instead of in the relationship to
it (attends)?

Any tips and opinions would be appreciated.

Cheers,
Emerson
___
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user