Performance Neo4j-慢速密码查询-带层次结构的大图

Performance Neo4j-慢速密码查询-带层次结构的大图,performance,graph,neo4j,cypher,Performance,Graph,Neo4j,Cypher,使用Neo4j 2.1.4。我有一个带有节点之间“IS a”关系(以及其他类型的关系)的图。我在图中有一些层次结构(是一种关系),我需要知道一个层次结构的后代(是一种关系),该层次结构与第二层次结构的某个后代具有特定的已知关系。如果存在特定的已知关系,我将返回第一个层次结构的后代 输入:'ID\u parentnode\u hierarchy\u 01','ID\u relationship','ID\u parentnode\u hierarchy\u 02'。 输出:与“ID\u paren

使用Neo4j 2.1.4。我有一个带有节点之间“IS a”关系(以及其他类型的关系)的图。我在图中有一些层次结构(是一种关系),我需要知道一个层次结构的后代(是一种关系),该层次结构与第二层次结构的某个后代具有特定的已知关系。如果存在特定的已知关系,我将返回第一个层次结构的后代

输入:'ID\u parentnode\u hierarchy\u 01','ID\u relationship','ID\u parentnode\u hierarchy\u 02'。
输出:与“ID\u parentnode\u hierarchy\u 02”的某个子代具有“ID\u relationship”的“ID\u parentnode\u hierarchy\u 01”的子代(是一种关系)

注意:该图有500.000个节点和200万个关系

我正在使用这个密码查询,但速度非常慢(4GB RAM和3GHz奔腾双核64位PC中的速度约为40秒)。有可能构建更快的查询吗

MATCH (parentnode_hierarchy_01: Node{nodeid : {ID_parentnode_hierarchy_01}})
WITH parentnode_hierarchy_01 
MATCH (parentnode_hierarchy_01) <- [:REL* {reltype: {isA}}] - (descendants01: Node)
WITH descendants01
MATCH (descendants01) - [:REL {reltype: {ID_relationship}}] -> (descendants02: Node)
WITH descendants02, descendants01
MATCH (parentnode_hierarchy_02: Node {nodeid: {ID_parentnode_hierarchy_02} }) 
<- [:REL* {reltype: {isA}}] - (descendants02)
RETURN DISTINCT descendants01;
MATCH(parentnode_hierarchy_01:Node{nodeid:{ID_parentnode_hierarchy_01})
具有父节点\u层次结构\u 01
匹配(parentnode_层次结构_01)(后代S02:节点)
带后代S02,后代S01
匹配(parentnode_hierarchy_02:Node{nodeid:{ID_parentnode_hierarchy_02})

好吧,我可以稍微整理一下您的查询-这可能有助于我们更好地理解问题。我怀疑这个会运行得更快,但使用清理过的版本,我们可以讨论发生了什么:(主要是消除不必要的使用
MATCH
/
WITH


这将通过您想要的桥返回从一个“根”到另一个“根”的路径。然后可以使用路径函数提取所需的任何节点。请注意,由于您的数据模型,当前无法执行此查询。

如果可能,请不要使用通用relationshiptypes和rel属性。这将减慢您的查询速度。我从CSV文件生成我的图形读取,其中包含“加载CSV,标题来自…”和“。。。创建(c1)-[:REL{reltype:REL.relid,reldesc:REL.desc}]->(c2)”。我不知道如何建立“rel.relid”(来自CSV文件)作为关系类型。这就是为什么我使用通用的“REL”关系。谢谢
MATCH (parent:Node {nodeid: {ID_parentnode_hierarchy_01}})<-[:REL* {reltype:{isA}}]-
      (descendants01:Node)-[:REL {reltype:{ID_relationship}}]->(descendants02:Node),

      (parent2:Node {nodeid: {ID_parentnode_hierarchy_02}})<-[:REL* {reltype:{isA}}]-
      (descendants02)
RETURN distinct descendants01;
MATCH p=shortestPath((p1:Node {nodeid: {first_parent_id}})-[:isA|ID_relationship*]-(p2:Node {nodeid: {second_parent_id}}))
return p;