Neo4j-如何确定要索引的内容?

时间:2019-07-15 21:13:05

标签: indexing neo4j cypher

假设我创建了5万个Person

UNWIND [ ... ] AS name
CREATE (:Person { name: name, joinTimestamp: 1000000 })

我需要让这些节点在彼此之间创建随机关系:

MATCH (p1:Person { joinTimestamp: 1000000 }), (p2:Person { joinTimestamp: 1000000 })
WITH p1, p2, rand() AS random
WHERE random < 0.001 AND p1 <> p2
MERGE (p1)-[:FRIENDS_WITH]->(p2)

这可行,但是我想加快第二个查询的速度。我应该索引什么?我假设Neo4j在p1期间将使用p2MERGE的ID来查找它们。我应该索引吗?还是应该为joinTimestamp属性建立索引,因为它是在MATCH查询中使用的?也许索引根本无法帮助此查询?

2 个答案:

答案 0 :(得分:2)

您不能使用节点的本机ID进行索引(因为节点的本机ID实际上不是该节点的“属性”)。而且您也不需要这样做,因为neo4j已经可以通过其本机ID快速到达节点。

相反,您可以为:Person(joinTimestamp)编制索引,因为joinTimestamp :Person的属性(您的查询可以在开始时使用它)。

顺便说一句,您始终可以使用profiling来验证将使用索引。

答案 1 :(得分:0)

Neo4j中的索引用于查找图形中的起点,遍历或类似操作不需要它们。

由于您正在通过joinTimestamp查找这些节点,因此索引:Person(joinTimestamp)是有意义的。基本上,您会寻找共同点,这意味着您打算在查询中查找节点(例如,通过其name属性查找人员节点)并在这些节点上添加索引。