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个数据库调用。有没有一种方法可以将这些查询优化为单个查询

当然,您可以将三个查询连接为一个。在这种情况下,您可以省略上一个查询的第一个和第二个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 *

最新更新