neo4j - 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 *
推荐阅读
- regex - 字符串中带有可选单词的正则表达式
- python - Numpy:在引用前一行值时使用矢量化循环?
- javascript - 在 Android 上接收文件
- mysql - 如果我想创建一个类似于 facebook 的具有“反应”的数据库,这种架构有意义吗?
- java - 使用 Post 动词,Spring Java 设置 Body Application/json,不带参数
- matrix - 将值代入 MuPad 矩阵中的变量
- haskell - Haskell 中的惰性加泰罗尼亚数字
- laravel - 如何使用 Redis TLS 配置 Laravel 5.7(使用 phpredis)
- delphi - Delphi:如何获取TImgView32控件滚动条的位置?
- python - 如何摆脱一个熊猫数据库中的对象(坐标)在另一个对象(坐标)的3个距离单位内?