我正在解决我的数据库中一个无法在Cypher中表达的复杂寻路问题,因此我需要将其分解为多个查询(并编写一个复杂的递归函数集)。 我的问题是关于在同一节点上进行多个查询的性能。当查询A返回节点X并且在下一个查询B中需要节点X时,告诉neo4j在查询B中查找节点X的最佳方法是什么?
最简单的方法是给每个节点一个名字,然后在查询A中返回X.name并在查询B中使用WHERE X.name = ....我想这真的很慢,因为neo4j必须检查数据库中每个节点的每个名称。有没有更快的方式,或者这实际上是最好的?
编辑:因为问题可能不完全清楚,我会提供一些关于我正在解决的问题的更多信息
我希望得到对某一特定技能有最佳了解的人,例如物理学。在数据库中,物理学和另一种技能之间存在联系,例如数学,它告诉数学知识对于物理学是有用的。但是现在我需要知道每个人在数学方面的熟练程度,这又是一个相同的过程。这是有意义的递归,但据我所知,Cypher没有递归,所以我将不得不在多个查询中将其拆分。
我想要防止的是,当在物理和数学之间找到一个链接时,计算每个人在数学中的知识的函数不必经过数据库中的每个节点来找到name ='maths ',这是非常无效的。
答案 0 :(得分:1)
我不知道我是否完全理解了您的问题,但我认为一个好的起点是在您的节点的name
属性中创建index。来自文档:
数据库索引是数据库中信息的冗余副本 为了使检索所述数据更有效。这个 这是以额外的存储空间和较慢的写入为代价的 决定索引什么和不索引什么是重要的,经常 非平凡的任务。
CREATE INDEX ON :NodeLabel(name)