假设我创建了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
期间将使用p2
和MERGE
的ID来查找它们。我应该索引吗?还是应该为joinTimestamp
属性建立索引,因为它是在MATCH
查询中使用的?也许索引根本无法帮助此查询?
答案 0 :(得分:2)
您不能使用节点的本机ID进行索引(因为节点的本机ID实际上不是该节点的“属性”)。而且您也不需要这样做,因为neo4j已经可以通过其本机ID快速到达节点。
相反,您可以为 顺便说一句,您始终可以使用profiling来验证将使用索引。:Person(joinTimestamp)
编制索引,因为joinTimestamp
是:Person
的属性(您的查询可以在开始时使用它)。>
答案 1 :(得分:0)
Neo4j中的索引用于查找图形中的起点,遍历或类似操作不需要它们。
由于您正在通过joinTimestamp查找这些节点,因此索引:Person(joinTimestamp)是有意义的。基本上,您会寻找共同点,这意味着您打算在查询中查找节点(例如,通过其name属性查找人员节点)并在这些节点上添加索引。