首页 > 解决方案 > Neo4J - 将 3 个合并查询优化为单个查询

问题描述

我正在尝试进行 Cypher 查询,该查询创建 2 个节点并在它们之间添加关系。

为了添加节点,我正在检查节点是否存在,如果存在,那么我只是继续设置一个属性。

// Query 1 for creating or updating node 1

MERGE (Kunal:PERSON)
ON CREATE SET
    Kunal.name = 'Kunal',
    Kunal.type = 'Person',
    Kunal.created = timestamp()
ON MATCH SET
    Kunal.lastUpdated = timestamp()
RETURN Kunal

// Query 2 for creating or updating node 2

MERGE (Bangalore: LOC)
ON CREATE SET
    Bangalore.name = 'Bangalore',
    Bangalore.type = 'Location',
    Bangalore.created = timestamp()
ON MATCH SET
    Bangalore.lastUpdated = timestamp()
RETURN Bangalore

同样,我正在检查上述创建的节点之间是否存在关系,如果不存在,则创建它,否则更新其属性。

// Query 3 for creating relation or updating it.

MERGE (Kunal: PERSON { name: 'Kunal', type: 'Person' })
MERGE (Bangalore: LOC { name: 'Bangalore', type: 'Location' })
MERGE (Kunal)-[r:LIVES_IN]->(Bangalore)
ON CREATE SET
    r.duration = 36
ON MATCH SET
    r.duration = r.duration + 1 
RETURN *

问题是这些是 3 个单独的查询,当我通过 Python 驱动程序运行它时,它们将有 3 个数据库调用。有没有办法将这些查询优化为单个查询。

标签: neo4jcypher

解决方案


当然,您可以将三个查询连接为一个。在这种情况下,您可以省略MERGE最后一个查询的第一个和第二个,因为它已经由新查询的开始来保证。

MERGE (kunal:PERSON {name: ‘Kunal'})
ON CREATE SET
    kunal.type = 'Person',
    kunal.created = timestamp()
ON MATCH SET
    kunal.lastUpdated = timestamp()
MERGE (bangalore:LOC {name: 'Bangalore'})
ON CREATE SET
    bangalore.type = 'Location',
    bangalore.created = timestamp()
ON MATCH SET
    bangalore.lastUpdated = timestamp()
MERGE (kunal)-[r:LIVES_IN]->(bangalore)
ON CREATE SET
    r.duration = 36
ON MATCH SET
    r.duration = r.duration + 1 
RETURN *

推荐阅读