Spring 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“
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