gpt4 book ai didi

java - Spring Data Neo4j 父子过滤

转载 作者:行者123 更新时间:2023-12-01 10:09:37 29 4
gpt4 key购买 nike

enter image description here

我有一个如上图所示的节点关系

我的类(class)

@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。我想查询属于图书馆 32 的图书,但只有用户 21 可以访问。

注意 - 尽管用户 21“CAN_ACCESS”图书馆 32,但这并不意味着他“CAN_ACCESS”图书馆 32 中“包含”的所有书籍

我目前在服务类别中的方法是

@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”为子级,其中包含已过滤的图书列表

最佳答案

您想要使用存储库查找器来进行此类查询。您要回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

并不真正推荐使用 native 图形 ID,因此如果您引入例如uuid 查询可能如下所示:

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

然后将带有此查询的查找器方法添加到 BookRepository 接口(interface)中:

@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);

关于java - Spring Data Neo4j 父子过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36214635/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com