我需要一些建议,以便在同一查询(同一密码脚本)期间在同一节点上添加和删除关系。
假设我们有一个: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个查询,或者我是否保留我的单个查询,无论如何这是实现即时尝试的最佳解决方案?
非常感谢您,祝您有美好的一天:)
答案 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
播放信息了。希望它会有用。