Re: [Neo4j] n-ary relationships
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
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
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