gpt4 book ai didi

neo4j - 在 neo4j 中使用 Unwind 和 Dumping 数据 - 查询优化

转载 作者:行者123 更新时间:2023-12-05 07:05:04 25 4
gpt4 key购买 nike

我正在进行批量插入以在neo4j中插入数据,但是我的事务正在花费大量时间,因为我的数据库也在不断增加。

在我的项目中,只有一个案例,我有超过 18,000 条记录,这些记录将存储在数据库中,并将与目标节点建立关系。每条记录将存储为 friend 节点

人际关系就像

Target_Node-[r:followed_by]->Friend_Node

Target_Node-[r:Friends_with]->Friend_Node

Target_Node-[r:Performs_Activity]->Friend_Node

我的查询针对所有情况分别执行,很可能目标和 friend 节点之间存在所有三种关系。

我为单个插入在每个线程发送 20 条记录,它展开记录数组并检查记录是否已存在于 Friend_Node 或 Target_Node 中,如果不存在则将其创建为 Friend_Node 然后为其分配关系;如果节点已经有关系并且一个新的关系被传递给查询,那么一个新的关系也将被添加到两个节点之间。

如果 Record 确实具有 Location 属性,我也会检查我的查询,然后我会创建一个 Location 节点并分配与之相关的关系。

注意:create_rel变量可以是Friends_with,Followed_by或Activity_p

我的查询如下

 """UNWIND [{id: "1235" , uid : "0"}] as user

UNWIND """+ l +""" as c

OPTIONAL MATCH (n:Target {id : c.id , uid : "0"})

OPTIONAL MATCH (m:Friend {id : c.id , screen_name:c.screen_name, uid : "0"})

WITH coalesce(n, m) as node,user,c // returns first non-null value

CALL apoc.do.when(node is null, "MERGE (n:Friend {id:c.id, name:c.name, profile: c.profile, location:c.location, uid : user.uid}) RETURN n", '', {c:c,user:user}) YIELD value

with coalesce(node, value.n) as y,user,c

MERGE (u:Target {id: user.id , uid : user.uid})

"""+create_rel+"""

foreach (sc in c.cityn | merge(cn:Location {location:sc.location, loc_lower : sc.loc_lower}) merge (y)-[:`located_at`]-(cn))

"""

Db 有时也会给出 TransientError 错误。

感谢反馈,因为我是一名学习者,并且会感谢宝贵的建议。

提前致谢

最佳答案

我认为您的主要问题在于如何合并和匹配节点。理想情况下,您总是希望节点具有唯一标识符。我可以看到 Friend 节点有一个属性 id,我假设它对于每个 FriendTarget 都是唯一的.

首先,您要对该属性创建一个唯一约束:

CREATE CONSTRAINT ON (f:Friend) ASSERT f.id IS UNIQUE;
CREATE CONSTRAINT ON (f:Target) ASSERT f.id IS UNIQUE;

Location 节点也需要类似的东西。似乎您同时存储了位置值和位置的小写值,因此它们中的任何一个对于每个节点都应该是唯一的。

CREATE CONSTRAINT ON (l:Location) ASSERT l.id IS UNIQUE;

现在您可以像这样优化您的查询:

"""UNWIND [{id: "1235" , uid : "0"}] as user

UNWIND """+ l +""" as c

OPTIONAL MATCH (n:Target {id : c.id})

OPTIONAL MATCH (m:Friend {id : c.id})

WITH coalesce(n, m) as node,user,c // returns first non-null value

CALL apoc.do.when(node is null,
"MERGE (n:Friend {id:c.id})
ON CREATE SET n+= {name:c.name, profile: c.profile,
location:c.location, uid : user.uid}
RETURN n", '', {c:c,user:user})
YIELD value
with coalesce(node, value.n) as y,user,c
MERGE (u:Target {id: user.id , uid : user.uid})
"""+create_rel+"""

foreach (sc in c.cityn |
merge(cn:Location {location:sc.location})
ON CREATE SET cn.loc_lower = sc.loc_lower
merge (y)-[:`located_at`]-(cn))

"""

关于neo4j - 在 neo4j 中使用 Unwind 和 Dumping 数据 - 查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62811379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com