2016-03-25 8 views
0

enter image description hereSpring Data Neo4j Eltern Kind Filterung

Ich habe einen Knoten Beziehung wie oben Diagramm

meine Klassen

@NodeEntity 
public class User 
{ 


    @GraphId 
    private Long id; 

    @Property(name="name") 
    private String name; 


    @Relationship(type = "CAN_ACCESS", direction = Relationship.OUTGOING) 
    private List<Library> libraries; 


    // is this necessary ????? 
    @Relationship(type = "CAN_ACCESS", direction = Relationship.OUTGOING) 
    private List<Book> books; 


    public User() 
    { 

    } 

    // getters 
    // setters 
} 


@NodeEntity 
public class Library 
{ 
    @GraphId 
    private Long id; 

    @Property(name="name") 
    private String name; 


    @Relationship(type = "CONTAINS", direction = Relationship.OUTGOING) 
    private List<Book> books; 

    // is this necessary ????? 
    @Relationship(type = "CAN_ACCESS", direction = Relationship.INCOMING) 
    private List<User> users; 


    public Library() 
    { 

    } 

    // getters 
    // setters 
} 

@NodeEntity 
public class Book 
{ 
    @GraphId 
    private Long id; 

    @Property(name="name") 
    private String name; 

    // is this necessary ????? 
    @Relationship(type = "CONTAINS", direction = Relationship.INCOMING) 
    private Library library; 

    // is this necessary ????? 
    @Relationship(type = "CAN_ACCESS", direction = Relationship.INCOMING) 
    private List<User> users; 


    public Book() 
    { 

    } 

    // getters 
    // setters 
} 

Ich habe Benutzerknoten-ID = 21 und Bibliotheksknoten-ID = 32 Ich möchte Bücher abfragen, die zur Bibliothek 32 gehören, auf die aber nur Benutzer 21 zugreifen kann.

Hinweis - obwohl Benutzer 21 "CAN_ACCESS" Bibliothek 32, das nicht bedeuten, dass er "CAN_ACCESS" Alle Bücher "ENTHÄLT" in der Bibliothek 32

Mein aktueller Ansatz in meiner Dienstklasse ist

@Autowired 
private LibraryRepository libraryRepository; 

@Autowired 
private UserRepository userRepository; 

@Autowired 
private BookRepository bookRepository; 

@Autowired 
private Session session; 


public void testGraph() 
{ 
    Long userId = 21; 
    Long libId = 32; 
    int depth = 1; 

    Library library = libraryRepository.findOne(32,depth); 
    List<Book> books = library.getBooks(); 
    List<Book> userAccessibleBooks = getUserAccessibleBooks(books,userId); 
} 

public List<Book> getUserAccessibleBooks(List<Book> books,Long userId) 
{ 
    // Loop over book list and get List<User> users; 
    // check this user "CAN_ACCESS" the book 
    // return accessible book list 
} 

Ich denke nicht, dass dies der beste Ansatz ist. Angenommen, Sie haben Millionen Bücher in der Bibliothek

Jede Lösung? oder fehlt mir etwas im Frühjahr Daten neo4j (Filter)? die Benutzer 21 „CAN_ACCESS“

+0

Ihren Ansatz scheint gut, denn wenn der Zugang zu einer Bibliothek gewährt keinen Zugang zu jedem Buch darin müssen Sie für jedes Buch angeben, ob Sie Zugang haben oder nicht. Ich empfehle, jede 'CAN_ACCESS'-Beziehung wie' CAN_ACCESS_BOOK' und 'CAN_ACCESS_LIBRARY' umzubenennen – Supamiu

Antwort

1

Sie verwenden möchten Repository-Finder für diese Arten von Anfragen

Zusammenfassung

I Bibliothek 32 mit gefiltertem Buchliste als Kinder bekommen möchten. Sie möchten List<Book> zurückgeben, damit dieses in BookRepository geht.

Der einfachste Weg ist es, eine Chiffre Abfrage zu definieren:

MATCH (u:User), (l:Library) 
WHERE 
ID(u) = {userId} AND ID(u) = {libraryId} 
MATCH 
(u)-[:CAN_ACCESS]->(b:Book), 
(l)-[:CONTAINS]-(b) 
RETURN b 

Verwendung von nativen Graph-IDs ist nicht wirklich zu empfehlen, wenn Sie also zum Beispiel vorstellen uuid die Abfrage könnte wie folgt aussehen:

MATCH 
(u:User {uuid:{userUuid}}), 
(l:Library {uuid:{libraryUuid}}), 
(u)-[:CAN_ACCESS]->(b:Book), 
(l)-[:CONTAINS]-(b) 
RETURN b 

Dann eine Finder-Methode mit dieser Abfrage in BookRepository Schnittstelle hinzufügen:

@Query("MATCH 
(u:User {uuid:{userUuid}}), 
(l:Library {uuid:{libraryUuid}}), 
(u)-[:CAN_ACCESS]->(b:Book), 
(l)-[:CONTAINS]-(b) 
RETURN b") 
List<Book> findBooksByUserAndLibrary(@Param("userUuid") String userUuid, @Param("libraryUuid) String libraryUuid); 
Verwandte Themen