我必须执行以下查询:
@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语句时,是否有其他方法可以使用多个起始点?似乎这些多个起点会减慢查询速度。
我是否必须定义索引?
谢谢!
答案 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')
您正在制作所有起始变量的笛卡尔积,然后在匹配中减少它。比赛结束后进行类型检查会更快。