Neo4j优化:查询从选定节点到选定节点的所有图形

时间:2016-08-24 13:44:13

标签: performance neo4j

我对neo4j不太熟悉,并且需要搜索从节点选择A到节点选择B的所有图形。

db中有大约600个节点,每个节点有一些关系。

节点属性:

  • riskId
  • de_DE_description
  • en_GB_description
  • en_US_description
  • 影响

选择

  • 选择A由属性匹配决定(属性:' riskId ')
  • 选择B是已​​知的常量节点列表(标签:'核心')

以下查询返回我想要的结果,但对我来说似乎有点慢:

match p=(node)-[*]->(:Core) 
where node.riskId IN ["R47","R48","R49","R50","R51","R14","R3"]
RETURN  extract (n IN nodes(p)| [n.riskId, n.impact, n.en_GB_description] )
as `risks`, length(p)

这个查询产生7行,每行有1到4个节点,所以不多。

我在本地环境中的响应时间 270ms或更长。 我没有创建任何索引或进行任何其他性能尝试。

任何提示我如何以更智能的方式制作查询或应用任何性能调整技巧?

非常感谢, 曼努埃尔

1 个答案:

答案 0 :(得分:2)

如果还没有一个标签由具有riskId属性的所有节点共享,则应该向所有节点添加这样的标签(例如,:Risk)。例如:

MATCH (n)
WHERE EXISTS(n.riskId)
SET n:Risk;

节点可以有多个标签。只要您在查询中指定该节点标签,这就可以使您的查询更快,因为它会将扫描限制为仅Risk个节点而不是所有节点。

但是,您可以通过首先创建索引来做得更好,如下所示:

CREATE INDEX ON :Risk(riskId);

之后,这个稍微改动的查询版本应该快得多,因为它会使用索引快速获取所需的Risk节点而不是扫描:

MATCH p=(node:Risk)-[*]->(:Core) 
WHERE node.riskId IN ["R47","R48","R49","R50","R51","R14","R3"]
RETURN
  EXTRACT(n IN nodes(p)| [n.riskId, n.impact, n.en_GB_description]) AS risks,
  LENGTH(p);