Neo4j制定Cypherquery,性能问题,多个起点

时间:2013-10-09 17:15:57

标签: performance neo4j spring-data

我必须执行以下查询:

@Query("START whps=node:__types__(className = 'de.adma.domain.WHProcessStep'), 
csd=node:__types__(className = 'de.adma.domain.CSDocument'),
whm=node:__types__(className = 'de.adma.domain.WHMachine')
MATCH whps<-[r1:RELATES_TO]-csd<-[r2:OCCURS_IN]-whm
WHERE (whps.id IN {0}) AND (csd.id IN {1})
RETURN DISTINCT whm ")

这些类中的每一个(CSDocument,WHMachine,..)都有相同的支架:

@NodeEntity
public class CSDocument {
 @GraphId
 Long nodeId;
 @Indexed(unique = true)
 String id;
 @Indexed(indexType = IndexType.FULLTEXT, indexName = "accessUri")
 String accessUri;

 // .. definition of some RelatedToVia-Relationships and getter/setters
}

查询是否以正确的方式查询neo4j?

目前,这适用于少量~10万节点/关系(查询需求<5秒)。 我需要这个~10mio节点/关系,但查询运行几分钟

我的测试环境是VM,Xeon 2,18Ghz(hexacore),32GB Ram,SSD。 JVM配置: -Xmx14000m -XX:MaxPermSize参数=4048米 -Xss3068m -XX:+ UseConcMarkSweepGC 我在Java-Spring应用程序中使用Neo4j embedded 1.8.1。

我有什么想法可以提高性能? 使用IN语句时,是否有其他方法可以使用多个起始点?似乎这些多个起点会减慢查询速度。

我是否必须定义索引?

谢谢!

2 个答案:

答案 0 :(得分:2)

在id-index上使用索引查找:

@Query("START whps=node:WHProcessStep(id = {0}), 
              csd=node:CSDocument(id = {1})
        MATCH whps<-[:RELATES_TO]-csd<-[:OCCURS_IN]-whm
        RETURN DISTINCT whm ")

如果你想将多个id传递给索引,你不幸的是必须将整个索引查询作为参数传递给你的方法:

@Query("START whps=node:WHProcessStep({0}), 
              csd=node:CSDocument({1})
        MATCH whps<-[:RELATES_TO]-csd<-[:OCCURS_IN]-whm
        RETURN DISTINCT whm ")
Collection<WHMachine> find(String whps, String csd);

其中两个字符串是:String whps =“id:(id1 id2 id3)”;

答案 1 :(得分:1)

如果你只是删除START子句的这些部分会更好吗?

csd=node:__types__(className = 'de.adma.domain.CSDocument'),
whm=node:__types__(className = 'de.adma.domain.WHMachine')

您正在制作所有起始变量的笛卡尔积,然后在匹配中减少它。比赛结束后进行类型检查会更快。