Neo4J单查询中如何将关系ID存入另一关系属性?
解决CQL中在单条查询内将关系ID存入另一个关系属性的问题
你当前的写法无法生效,是因为在同一条CREATE语句里,所有元素是一次性创建的——当你试图给GO_TO关系的attack_id赋值r.id时,ATTACK关系r还没完成持久化,Neo4j还没为它分配ID,所以这个属性会被忽略。
要实现需求,需要用WITH关键字拆分查询步骤,先完成节点和ATTACK关系的创建,确保r获得ID后,再创建GO_TO关系:
CREATE(a:IP_ADDRESS {name: "224.36.71.118"}), (b:TARGET {honeypot: "cowrie", target_post: "2222", target_protocol: "tcp", analyzer_id: "VM1"}), (c:Unknown {name: 'uname -a;lspci', threat_phase:"Unknown", threat_purpose: "Unknown", threat_category: "Unknown", time: "2022-07-21T00:02:03+0000"}), (a)-[r:ATTACK {time: "2022-08-21T19:51:05+0000"}]->(b) WITH r, b, c CREATE (b)-[:GO_TO {attack_id: r.id}]->(c)
额外建议
Neo4j的内部关系ID(r.id)是逻辑ID,可能在关系删除后被复用,如果你需要一个稳定的唯一标识,建议自己生成UUID作为ATTACK关系的属性,比如使用uuid()函数:
CREATE(a:IP_ADDRESS {name: "224.36.71.118"}), (b:TARGET {honeypot: "cowrie", target_post: "2222", target_protocol: "tcp", analyzer_id: "VM1"}), (c:Unknown {name: 'uname -a;lspci', threat_phase:"Unknown", threat_purpose: "Unknown", threat_category: "Unknown", time: "2022-07-21T00:02:03+0000"}) WITH a, b, c CALL { WITH a, b CREATE (a)-[r:ATTACK {time: "2022-08-21T19:51:05+0000", attack_uuid: uuid()}]->(b) RETURN r } CREATE (b)-[:GO_TO {attack_id: r.attack_uuid}]->(c)
这种方式生成的标识不会因为数据操作被复用,可靠性更高。
内容的提问来源于stack exchange,提问作者Kevin Hobert
相关产品推荐
相关产品推荐

