Announcement Announcement Module
Collapse
No announcement yet.
Modeling Direction.BOTH Relationships with @RelatedToVia element classes on Neo4J Page Title Module
Move Remove Collapse
X
Conversation Detail Module
Collapse
  • Filter
  • Time
  • Show
Clear All
new posts

  • Modeling Direction.BOTH Relationships with @RelatedToVia element classes on Neo4J

    Hi All,

    I must say that the project is looking amazing!!! Congratulations Spring team and Neo4J team to bring this together... I must say I was already in love with NoSQL using MongoDB, but Graph Databases with Neo4J is just a piece of art!!! After watching the presentation about Spring Data Graph, I must say I was hooked after I saw the term "Polyglot Persistence" and I decided to give this a try!!!

    Suppose I have an RBAC model such that users are granted action permissions to applications... The questions I'd like to answer about it is as follows:

    1. Which permissions a user have been granted to a set of applications?
    2. Which users have certain action permissions to an application?

    User <---> Permission <---> Application

    By reading the documentation, I thought I could use a @Direction.BOTH implementation of a @RelationshipEntity using a @RelatedToVia aggregation on my User @NodeEntity... Here's the code snippet for User...

    Code:
    @NodeEntity
    public class User {
    
        @Indexed
        private String id;
    
        @Indexed
        private String username;
    
        @RelatedToVia(type = "grantedPermissions", Direction.BOTH, elementClass = Permission.class)
        Iterable<Permission> permissions;
    
        public Iterable<Permission> getPermissions() {
            return this.permissions;
        }
        ...
        ...
    }
    The implementation of the Application @NodeEntity... At this point, I decided to paste the same code, but with a different property name and same "type" value for the annotation @RelatedToVia using @Direction.BOTH...

    Code:
    @NodeEntity
    public class Application {
    
        @Indexed
        private String id;
    
        @Indexed
        private String name;
         
        ...
        ...
        @RelatedToVia(type = "grantedPermissions", Direction.BOTH, elementClass = Permission.class)
        Iterable<Permission> permittedUsers;
    
        public Iterable<Permission> getPermittedUsers() {
            return this.permittedUsers;
        }
    }
    Now here are the questions for the implementation Permission as @RelationshipEntity...

    1. Can I express the @StartNode and the @EndNode in the same property on a @RelationshipEntity?

    2. Given the "public enum Action { CREATE, VIEW, EDIT, DELETE }", can I have a set of ENUMs as a @RelationshipEntity property?

    Here's the implementation of the @RelationshipEntity...

    Code:
    @RelationshipEntity
    public class Permission {
    
        @StartNode
        @EndNode
        private User user;
    
        @EndNode
        @StartNode
        private Application application;
    
        private Set<Action> actions;
    
        public Permission() {
            
        }
    
        public void addAction(Action action) {
            this.actions.add(action);
        }
    
    }
    Would this work? I'm still setting up my environment and I'm adding this to the my-restaurants-social application based on the Neo4J presentation...

    Thanks
    Marcello

  • #2
    I'm not sure about the @RelationshipEntity question, but I posted a question regarding Direction.Both using @RelatedToVia a few weeks ago that you might want to check out.

    Comment


    • #3
      Marcello,

      I have a question regarding your domain. Is the relationship really bidirectional?

      I.e. are there permissions that go _from_ the application, _to_ the user?

      You really only need both if you have relationships that might be incoming and outgoing and you want to collect all of them.

      I.e. having User - follows -> User
      Then I can get all the social contacts of the user by using both, and its followers by using Direction.INCOMING and the people he follows by Direction.OUTGOING.

      I'm afraid the mixing of annotations you did in Permission does not work that way as for each field it has to be deterministic which annotation applies.

      I think you just have to use Direction.OUTGOING on user and Direction.INCOMING on Application if your Relationship goes that way (or the other way round if it
      goes from Application to User).

      Yes, you can have enums as properties (for both Node and Relationship-Entities), they are converted using the provided conversion service which hooks into Spring's Conversion facilities.

      Right now we don't support Set's or other collection types for non-enty values but that will come in the next SDG release. You could try to create an array of your enums.
      That should probably work. And then create the set on the fly when you access the field return new EnumSet<Action>.of(actions).

      Hope that helps, just ask if you have further questions. And thanks for the praise

      Cheers

      Michael

      Comment

      Working...
      X