如何使用Spring Data Neo4j 5存储库检索路径

时间:2018-07-22 22:17:38

标签: spring neo4j spring-data-neo4j

我在neo4j中建模了一个简单的有限状态机图,其中的域由State个实体和一个FOLLOWED_BY关系组成(在密码中为(s1:State)-[r:FOLLOWS]->(s2:State))。 每个都有一些属性。我现在需要分析状态之间的关系,并且不知道返回类型如何 存储库界面应如下所示。

实体和关系类的代码(缩短的代码)(带有龙目注释):

@NodeEntity
@NoArgsConstructor
public class State {
  @Getter
  private String name;
  @Getter
  private String       inputVariable;
  @Getter
  private String       outputVariable;
}

@RelationshipEntity(type = "FOLLOWED_BY")
@NoArgsConstructor
public class Transition implements FlowTransition {
  @Getter
  @Property
  private String guard;
  @Getter
  @StartNode
  private State        sourceState;
  @Getter
  @EndNode
  private State        targetState;
}

对于某些分析,从一个状态到随后的状态存在哪些路径,其中第一个状态的输出变量用作 以下状态的输入变量,我需要查询返回的路径。当我使用SDN时,我想拥有它 从存储库(自定义)查询中返回。

@Repository
public interface StateRepository extends Neo4jRepository<State, Long> {

  @Query("MATCH p=allShortestpaths((s1:State)-[r:FOLLOWED_BY*1..200]->(s2:State))"
         + " WHERE s1.outputVariable = s2.inputVariable AND id(s1) = {eId}"
         + " RETURN p)"
  ??? findAllByBpelPathRegEx(@Param("eId") String startId);
}

我的问题是:我应该使用哪个类作为获取路径对象的返回类型? EntityPathEndResult在SDN5中似乎不再存在(也许还有4个),那该怎么办?也许是投影,但它们应该看起来像吗?

2 个答案:

答案 0 :(得分:0)

根据这个问题和答案How do I query for paths in spring data neo4j 4?

从SDN 4开始不支持

EntityPath,并且您应该使用Iterable<Map<String, Object>>作为返回类型(btw:List<Map<String, Object>>都可以)。 Map<String, Object>的键是您在Cypher查询中返回的变量的名称(在示例中,它是p中的RETURN p)。

顺便说一句:最好返回RETURN nodes(p) AS nodes, relationships(p)(映射键:nodesrelationships(p)),因为这样会返回定义的@NodeEntity@RelationshipEntity对象不仅是简单的路径对象(仅包含id(作为字符串),还没有节点对象本身)

答案 1 :(得分:0)

You can take the result in an object class or you need to create a class having @QueryResult annotation collect the s1 and s2.