SpringDataNeo4J4对于大型分层查询速度非常慢
我目前使用的是SpringDataNeo4j–4.1.0.M1,有一个用例,我需要获取一个子图(实际上是一棵树),并以类似于此的层次结构返回它(这些子图通常大约有500个节点,深度未指定):SpringDataNeo4J4对于大型分层查询速度非常慢,neo4j,cypher,spring-data-neo4j,spring-data-neo4j-4,Neo4j,Cypher,Spring Data Neo4j,Spring Data Neo4j 4,我目前使用的是SpringDataNeo4j–4.1.0.M1,有一个用例,我需要获取一个子图(实际上是一棵树),并以类似于此的层次结构返回它(这些子图通常大约有500个节点,深度未指定): ... 数据模型: @NodeEntity public abstract class Event { @GraphId private Long id; private Long dbId; private String displayName; ... o
...
数据模型:
@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
}
@NodeEntity
公共抽象类事件{
@格拉希德
私人长id;
私有长dbId;
私有字符串显示名;
…其他关系和属性
}
@节点性
公共课路径扩展事件{
@关系(type=“hasEvent”,direction=Relationship.OUTGOING)
私人活动;
…其他关系和属性
}
@节点性
公众阶级的反应扩大了这一事件{
…其他关系和属性
}
为了解决这个问题,我创建了以下查询:
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");
stringquery=“匹配(n:Pathway{dbId:123456})-[r:hasEvent*]->(m:Event)返回n,r,m”;
Result=neo4jTemplate.query(query,Collections.emptyMap());
返回result.iterator().next().get(“n”);
这正在工作,并按预期返回结果。唯一的问题是速度。在使用Neo4j浏览器测试查询时,我在50-100ms内得到了一个结果。使用SDN,Spring将结果映射到对象需要2秒以上的时间
现在的问题是:我有没有办法在Spring中加速这个查询,或者有没有更好的解决方案,我可以使用类似嵌套集合的方式在Cypher中返回这个层次结构(因为我只需要名称和ID,而不需要对象本身)?似乎非常慢。使用手动查询而不是模板方法有什么原因吗?我原以为您可以使用
neo4jTemplate.load(Pathway.class,Pathway.getId(),-1)
其中-1表示获取深度(在本例中为无限)。您是否检查了返回的结果数量,并且您是否能够分析代码以找出其性能不好的地方?如果仅使用深度参数,则无法指定特定关系(hasEvent)来遍历图形(否则可能会加载整个图形)。在这种特定情况下,将返回527个对象。我认为一个问题可能是,即使我忽略了所有其他关系,对象仍然具有丰富的信息(每个对象大约有5-10个填充属性)。我还并没有分析代码,只是记录了执行Result=neo4jTemplate.query(query,Collections.emptyMap())的时间代码>
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");