我对neo4j不太熟悉,并且需要搜索从节点选择A到节点选择B的所有图形。
db中有大约600个节点,每个节点有一些关系。
节点属性:
选择
以下查询返回我想要的结果,但对我来说似乎有点慢:
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或更长。 我没有创建任何索引或进行任何其他性能尝试。
任何提示我如何以更智能的方式制作查询或应用任何性能调整技巧?
非常感谢, 曼努埃尔
答案 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);