我想让所有标签都属于某个节点,如果有办法在SDN 4.0的一个查询中执行此操作?
例如,我目前的回购就像
Book findById(Long bookId);
@Query("MATCH (n:Book) where id(n)={0} set n:AnotherLabel return n")
Book updateBookLabel(Long bookId);
无论如何我可以简单地
book.getLabels();
检索此图书节点的所有标签。
书的课程是
@NodeEntity
public class Book extends Something {
}
是的,默认情况下,我的Book节点应该有两个标签Book
和Something
。因为我在repo中有一个更新方法来添加另一个标签。无论如何,我可以检索所有3个标签的书吗?
由于
答案 0 :(得分:2)
唯一的方法是通过自定义查询 -
@Query("MATCH (n:Book) where id(n)={0} return labels(n) as labels")
List<String> getBookLabels(Long bookId);
(未测试的)
根据评论进行更新
要在单个查询中返回标签和节点属性,请使用@QueryResult -
SDN 4.0 (无法将自定义查询中的节点和关系映射到查询结果中的域实体):
@QueryResult
public class BookResult {
Long id;
Map<String,Object> node;
List<String> labels;
}
@Query("MATCH (n:Book) where id(n)={0} return labels(n) as labels, ID(n) as id, {properties: n} as node")
BookResult getBookLabels(Long bookId);
SDN 4.1
@QueryResult
public class BookResult {
Book node;
List<String> labels;
}
@Query("MATCH (n:Book) where id(n)={0} return labels(n) as labels, n as node")
BookResult getBookLabels(Long bookId);
答案 1 :(得分:0)
是的,这是一个可行的例子
<强>实体强>
public class Book {
@Labels
Set<String> labels= new HashSet<>();
private Long id;
}
<强>回购强>
public interface BookRepository extends GraphRepository<Book>
{
}
var标签将包含节点的所有标签,因为它带有@Label
注释,因此如果需要,您可以根据需要执行book.getlabel()
甚至setLabel()
。< / p>
我在这个例子中使用了 spring boot 1.4.0 和 neo4j community 3.0.4 。