如何用Neo4j脚本基于其他属性/节点值设置THREAT节点的rating?
问题描述
我在Neo4j数据库中有不同类型的节点,每种节点都带有多个属性。其中THREAT类型节点包含以下属性:id、description、impact、name、rating。
创建该类节点时,我能获取除rating外的所有属性值,因为rating属性依赖于其他节点的值,或由应用程序传入Neo4j。
创建THREAT节点的示例脚本如下:
(t_repudiate: THREAT {name: "NON_REPUDIATION", desc: "Break Non-repudiation", impact: "Repudiate Transactions", rating: ""}),
rating的设置条件示例如下:
- 当关联节点的PII/PHI数量 > 5000时,
NON_REPUDIATION的rating设为high; - 当关联节点的完整性要求为
high或critical时,NON_REPUDIATION的rating设为high。
请问能否通过Neo4j脚本实现上述需求?
解决方案
可以通过Neo4j的Cypher脚本实现需求,分两种典型场景处理:
1. 创建节点时直接计算赋值
如果创建THREAT节点时能直接获取到依赖的其他节点数据,可在创建语句中通过CASE表达式判断赋值rating。假设依赖的是存储PII/PHI数量和完整性要求的ASSET节点,且两者存在AFFECTS关联,示例脚本如下:
MATCH (a:ASSET) WHERE a.pii_phi_count > 5000 OR a.integrity_requirement IN ["high", "critical"] CREATE (t:THREAT { name: "NON_REPUDIATION", desc: "Break Non-repudiation", impact: "Repudiate Transactions", rating: CASE WHEN a.pii_phi_count > 5000 OR a.integrity_requirement IN ["high", "critical"] THEN "high" ELSE "medium" END }) MERGE (t)-[:AFFECTS]->(a)
如果依赖数据由应用程序传入,可使用参数化查询:
CREATE (t:THREAT { name: "NON_REPUDIATION", desc: "Break Non-repudiation", impact: "Repudiate Transactions", rating: CASE WHEN $piiPhiCount > 5000 OR $integrityReq IN ["high", "critical"] THEN "high" ELSE "medium" END })
2. 创建后批量更新rating
如果创建THREAT时无法获取依赖数据,可先创建rating为空的节点,后续通过匹配条件批量更新:
MATCH (t:THREAT {name: "NON_REPUDIATION"}) MATCH (a:ASSET) WHERE (t)-[:AFFECTS]->(a) SET t.rating = CASE WHEN a.pii_phi_count > 5000 OR a.integrity_requirement IN ["high", "critical"] THEN "high" ELSE "medium" END
若依赖的是其他类型节点或不同关联关系,只需调整MATCH语句中的节点标签和关系类型即可。
内容的提问来源于stack exchange,提问作者JAMSHAID
相关产品推荐
相关产品推荐

