如何在单个neo4j查询中删除和添加关系?

时间:2019-04-02 14:18:31

标签: neo4j cypher

我需要一些建议,以便在同一查询(同一密码脚本)期间在同一节点上添加和删除关系。

假设我们有一个:User,它与节点:Page有几种关系。 我想从数组['toto', 'titi', 'tete']中添加缺少的关系,并且我也想删除数据库中已存在但数组中不存在的关系。

MATCH (u:User {username: "carere"}), (pages:Page) WHERE pages.title IN ['toto', 'titi', 'tete']
WITH u, pages
MERGE (u)-[:WROTE]->(pages)
WITH u, pages
MATCH (u)-[r:WROTE]->(p) WHERE NOT p.title IN ['toto', 'titi', 'tete']
DELETE r
RETURN u, r, pages

该查询正在运行,但是我想知道是否应该将该语句分隔为2个查询,或者我是否保留我的单个查询,无论如何这是实现即时尝试的最佳解决方案?

非常感谢您,祝您有美好的一天:)

1 个答案:

答案 0 :(得分:0)

您可以将所有需要的内容保留在一个查询中,只要它能提供所需的结果即可。处理数据的最佳方法取决于架构和数据库中的数据量。看一下Query tuning,其中包括执行计划和配置文件。

例如,在对查询进行性能分析后,在最小数据集上,我得到了一个摘要

Cypher version: CYPHER 3.5, planner: COST, runtime: INTERPRETED. 76 total db hits in 11 ms.

在同一数据集上,我尝试修改查询

profile 
MATCH (u:User {username: "carere"})-[r:WROTE]->(:Page) DELETE r
WITH u MATCH (pages:Page) WHERE pages.title IN ['toto', 'titi', 'tete']
MERGE (u)-[r:WROTE]->(pages)
RETURN u, r, pages

带有摘要

Cypher version: CYPHER 3.5, planner: COST, runtime: INTERPRETED. 70 total db hits in 9 ms.

但是如果我们将数据集扩展为带有查询的其他独立节点

UNWIND range(0, 100) as entityId
CREATE (: User {username: "user" + entityId})-[:WROTE]->(: Page {title: "title" + entityId})

然后分析摘要看上去会有所不同

# first query
Cypher version: CYPHER 3.5, planner: COST, runtime: INTERPRETED. 1562 total db hits in 52 ms.

#modified query
Cypher version: CYPHER 3.5, planner: COST, runtime: INTERPRETED. 676 total db hits in 19 ms.

这样,您就可以开始使用indexes and schema tuning

播放信息了。

希望它会有用。