Spring 数据 Neo4j 父子过滤
Spring Data Neo4j Parent Child filtering
我的节点关系如上图
我的类
@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
}
我有用户节点 ID = 21 和图书馆节点 ID = 32.I 想查询属于图书馆 32 但只有用户 21 可以访问的图书。
注意 - 虽然用户 21 "CAN_ACCESS" 图书馆 32,但这并不意味着他 "CAN_ACCESS" 图书馆 32"CONTAINS" 中的所有图书 "CONTAINS"
我目前的服务方式class是
@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
}
我认为这不是最好的方法。假设您的图书馆中有数百万本书
有什么解决办法吗?或者我在 Spring 数据 neo4j(过滤器)中遗漏了什么?
总结
我想获取图书馆 32,并将过滤后的图书列表作为子用户 21 "CAN_ACCESS"
您想对此类查询使用存储库查找器。你想要 return List<Book>
所以这将进入 BookRepository。
最简单的方法是定义密码查询:
MATCH (u:User), (l:Library)
WHERE
ID(u) = {userId} AND ID(u) = {libraryId}
MATCH
(u)-[:CAN_ACCESS]->(b:Book),
(l)-[:CONTAINS]-(b)
RETURN b
不真正推荐使用原生图形 ID,因此如果您引入例如uuid 查询可能如下所示:
MATCH
(u:User {uuid:{userUuid}}),
(l:Library {uuid:{libraryUuid}}),
(u)-[:CAN_ACCESS]->(b:Book),
(l)-[:CONTAINS]-(b)
RETURN b
然后将带有此查询的查找器方法添加到 BookRepository 接口中:
@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);
我的节点关系如上图
我的类
@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
}
我有用户节点 ID = 21 和图书馆节点 ID = 32.I 想查询属于图书馆 32 但只有用户 21 可以访问的图书。
注意 - 虽然用户 21 "CAN_ACCESS" 图书馆 32,但这并不意味着他 "CAN_ACCESS" 图书馆 32"CONTAINS" 中的所有图书 "CONTAINS"
我目前的服务方式class是
@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
}
我认为这不是最好的方法。假设您的图书馆中有数百万本书
有什么解决办法吗?或者我在 Spring 数据 neo4j(过滤器)中遗漏了什么?
总结
我想获取图书馆 32,并将过滤后的图书列表作为子用户 21 "CAN_ACCESS"
您想对此类查询使用存储库查找器。你想要 return List<Book>
所以这将进入 BookRepository。
最简单的方法是定义密码查询:
MATCH (u:User), (l:Library)
WHERE
ID(u) = {userId} AND ID(u) = {libraryId}
MATCH
(u)-[:CAN_ACCESS]->(b:Book),
(l)-[:CONTAINS]-(b)
RETURN b
不真正推荐使用原生图形 ID,因此如果您引入例如uuid 查询可能如下所示:
MATCH
(u:User {uuid:{userUuid}}),
(l:Library {uuid:{libraryUuid}}),
(u)-[:CAN_ACCESS]->(b:Book),
(l)-[:CONTAINS]-(b)
RETURN b
然后将带有此查询的查找器方法添加到 BookRepository 接口中:
@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);