在我的项目中,有一种情况下,我有超过18,000条记录需要存储到数据库,并与目标节点建立关系。每条记录将被存储为友好节点。
关系如下: Target_Node-[r:followed_by]->Friend_Node Target_Node-[r:Friends_with]->Friend_Node Target_Node-[r:Performs_Activity]->Friend_Node 我的查询将分别对所有情况执行,并且很可能一个目标和友好节点之间会有这三个关系之一。
对于单个插入,我为每个线程发送20条记录,对记录数组进行展开,检查记录是否已经存在于Friend_Node或Target_Node中,如果不存在,则将其创建为Friend_Node并将关系分配给它;如果节点已经具有关系并且传递给查询一个新关系,则还会在两个节点之间添加新关系。
此外,在我的查询中,我还会检查记录是否具有位置属性,如果是,则会创建一个位置节点并将其与之关联。 注意: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))
"""
有时候,数据库会出现瞬态错误。
作为一名学习者,欢迎提供反馈并感谢有价值的建议。
提前致谢。