我有一个有500 K节点和700 K关系的数据库。我用一个新类型的DummyEdge
创建了500个额外的关系,edge_id
属性从"1“到" 500”。现在我想查询和修改这些关系。运行一个查询MATCH ()-[e:DummyEdge {edge_id:"123"}]->() SET e.property="value"
非常慢,大约需要300 is,所以如果我运行500个这样的查询,大约需要2-3分钟。我也调用了CREATE INDEX ON :DummyEdge(edge_id)
,但是它并没有加快查询的执行速度。
有没有办法使这种大规模的关系修改更快?
发布于 2020-01-07 18:29:11
创建索引为节点创建索引,因此这样的索引不会影响查询的性能。
由于您的MATCH
模式()-[e:DummyEdge {edge_id:"123"}]->()
没有提供关于终端节点的信息,所以neo4j必须扫描DB中的每个关系才能找到所需的关系。这就是您的查询速度如此慢的原因。
如果您的查询(如@ MichaelHunger所述)为MATCH
模式中的任何一个节点提供有用的信息(如标签或索引标签/属性对),则效率要高得多。这将有助于neo4j缩小需要扫描的关系的数量。例如,让我们声明开始节点必须具有Foo
标签:
MATCH (:Foo)-[e:DummyEdge {edge_id:"123"}]->()
SET e.property="value"
使用上面的查询,neo4j只需要查看Foo
节点的传出关系,这要快得多,因为neo4j可以快速找到具有给定标签(或索引)的节点。
现在,neo4j还支持https://neo4j.com/docs/cypher-manual/current/schema/index/#schema-index-fulltext-search,后者支持关系索引。然而,这些类型的索引需要您付出更多的努力,并且可能会对用例造成太大的损失。
发布于 2022-04-27 08:56:01
https://stackoverflow.com/questions/59632750
复制相似问题