1

我必须执行以下查询:

@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 的正确方法?

目前,这适用于最多约 100k 节点/关系的少量(查询需要 <5 秒)。我需要这个用于 ~10mio 节点/关系,但查询会运行几分钟

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

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

我必须定义一个索引吗?

谢谢!

4

2 回答 2

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)";

于 2013-10-10T12:02:37.453 回答
1

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

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

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

于 2013-10-09T17:42:47.360 回答