有没有办法在SDN 4.0中获取节点的所有标签

时间:2016-03-14 01:10:25

标签: neo4j spring-data-neo4j spring-data-neo4j-4

我想让所有标签都属于某个节点,如果有办法在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节点应该有两个标签BookSomething。因为我在repo中有一个更新方法来添加另一个标签。无论如何,我可以检索所有3个标签的书吗?

由于

2 个答案:

答案 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