我目前正在使用 SpringDataNeo4j-4.1.0.M1 并且有一个用例,我需要获取一个子图(实际上是一棵树)并以类似于此的层次结构返回它(这些子图通常大小约为500个节点,并且具有未指定的深度):
<Pathway dbId="1" displayName="Name1">
<Pathway dbId="2" displayName="Name2">
<Pathway dbId="3" displayName="Name3">
<Reaction dbId="4" displayName="Name4" />
<Reaction dbId="5" displayName="Name5" />
<Pathway dbId="6" displayName="Name6">
<Reaction dbId="7" displayName="Name7" />
</Pathway>
</Pathway>
...
数据模型:
@NodeEntity
public abstract class Event {
@GraphId
private Long id;
private Long dbId;
private String displayName;
... other relationships and properties
}
@NodeEntity
public class Pathway extends Event {
@Relationship(type="hasEvent", direction = Relationship.OUTGOING)
private List<Event> hasEvent;
... other relationships and properties
}
@NodeEntity
public class Reaction extends Event {
... other relationships and properties
}
为了解决这个问题,我创建了以下查询:
String query = "Match (n:Pathway{dbId:123456})-[r:hasEvent*]->(m:Event) Return n,r,m";
Result result = neo4jTemplate.query(query,Collections.<~>emptyMap());
return result.iterator().next().get("n");
这是有效的,并按预期返回结果。唯一的问题是速度。在使用Neo4j-Browser测试查询时,我得到的结果在50-100ms内。使用SDN,Spring需要2秒钟才能将结果映射到对象。
现在的问题是:有没有办法可以在Spring中加速这个查询,或者有更好的解决方案,我可以使用嵌套集合之类的东西在Cypher中返回这个层次结构(因为我只需要名称和ID,不是对象本身)?