Neo4j避免循环导致密码查询

时间:2015-06-18 04:47:55

标签: neo4j cypher ontology

我将统一医学语言系统(UMLS)本体加载到Neo4j以及SNOMED概念节点之间的关系。任何两个节点之间可以存在多种类型的关系。 UDAS的2015AA版本和我选择的选项产生了1,256,982个SNOMED节点和2,258,642个关系。此查询将生成SNOMED根节点的预期21个子节点:

MATCH (n:MRCONSO{AUI:'A3684559'}) match n<-[*..1]-x return count(*)

增加查询深度会导致问题。此查询在返回

中生成3338行
MATCH (n:MRCONSO{AUI:'A3684559'}) match n<-[*..2]-x return id(x)

有11行,其中id不唯一。在此查询中也可以看到这导致3327行(3338-11)

MATCH (n:MRCONSO{AUI:'A3684559'}) match p=shortestpath(n<-[*..2]-x) return id(x)

因此,我可以使用最短路径获取唯一的子节点ID。但是,第二次和第三次查询的查询时间分别为52 ms和61745。随着更深层次的询问,其中任何一个都会恶化。

有没有办法避免查询中的循环,从而缩短查询时间?

1 个答案:

答案 0 :(得分:0)

您使用的是哪个版本的Neo4j?尝试更新到2.2.2

您是否能够确定获得这些重复ID的原因? 可能是一个孩子可以在两个层面上到达

此外,您的查询将同时输出1级和2级孩子。

您可以输出某个重复ID的所有路径吗?

获得唯一ID是否足够好?然后你可以使用distinct。

MATCH (n:MRCONSO{AUI:'A3684559'})
MATCH (n)<-[*..2]-(x) 
RETURN distinct id(x)

您在:MRCONSO(AUI)上有索引或约束吗?