2

我将在我的应用程序Neo4j Manual Index on Relationship Properties中尝试解决我遇到的性能问题Neo4j Cypher 查询性能优化

我有几个问题在 Neo4j 官方文档中并不清楚:

MATCH (:Flight)-[r:DESTINATION]->(:Airport)
CALL apoc.index.addRelationship(r,['taxi_time'])
RETURN count(*)

该语句将创建与关系类型同名的关系索引,在本例中为 DESTINATION,并通过其属性将关系添加到索引中。

  1. 我什么时候需要创建这个关系索引?它应该执行一次(假设在应用程序启动时)还是每次在节点-[r:DESTINATION]->之间添加新关系Flight时都需要调用此 APOC 函数Airport

  2. 在现有-[r:DESTINATION]->关系更新的情况下,如何在相应的手动索引中更新此信息?

  3. 如果删除一些FlightAirport节点 - 我是否需要手动查找并-[r:DESTINATION]->从手动索引中删除适当的关系,或者它会由 APOC 和 Neo4j 自动完成?

  4. 对于 Spring Data Neo4j 项目 - 如何正确执行包含 APOC 函数的查询?例如,我想调用apoc.index.addRelationship 以便为关系属性创建手动索引。我可以org.neo4j.ogm.session.Session.query用于此目的吗?

  5. 手动索引使用什么一致性模型 - 他们在索引和原始数据之间使用最终一致性还是强一致性模型?

4

1 回答 1

2

我同意 Neo4J 关于这个问题的文档确实不够。

要回答您的问题:

1.如果您从使用自动关系索引的旧版本升级 Neo4J,您需要运行 APOC(仅一次)来使用类似的东西来索引您现有的关系

MATCH ()-[r]->() CALL apoc.index.addRelationship(r,['property_1','property_2']) RETURN count(*);

然后,您需要为添加到该索引的任何新关系设置触发器,运行一次如下所示:

CALL apoc.trigger.add('RELATIONSHIP_INDEX',"UNWIND {createdRelationships} AS r MATCH ()-[r]->() CALL apoc.index.addRelationship(r,['property_1','property_2']) RETURN count(*)", {phase:'after'})

(您需要先apoc.trigger.enabled=trueneo4j.conf文件中激活)

2.见上

3.您还需要从索引中删除它们,它不会自动完成。为此设置一个 APOC 触发器removeRelationshipByName()

4.应该可以。

5. Neo4J 的人应该回答这个问题。

希望这对您有所帮助并节省一些时间!

于 2018-02-20T13:56:51.610 回答