Neo4J深度验证图



DB有一定数量的OrderItemType,它们之间有关系,如INCOMPATIBLE和REQUIRED

我们通过使用CONTAINS关系将OrderItemType链接到订单来组合订单

当尝试添加与图中的另一个不兼容的新OrderItemType时,如果所需的项还不存在,是否可能使约束失败并出现验证错误?

目标只是试图插入,如果它违反了的某些条件,就会被拒绝

另一种选择-使用交易:1.插入项目2.手动加载图和检查规则3.如果发现一些问题,则回滚

更新好的,我会用标准电影样本重新表述这个问题

让我们在参与者之间建立一些关系

CREATE (Keanu)-[:HATE]->(JackN),
(Keanu)-[:REQUIRE]->(LillyW),
(JamesM)-[:HATE]->(LillyW)

现在我们开始制作新的电影

CREATE (RaiseOfCrazyDev:Movie {title:'RaiseOfCrazyDev', released:2020, tagline:'Crazy developer  conquer the world'})

并开始铸造。首先我们签署JackNJamesM

CREATE (JackN)-[:ACTED_IN {roles:['Father']} ]->(RaiseOfCrazyDev),
(JamesM)-[:ACTED_IN {roles:['BadGuy']} ]->(RaiseOfCrazyDev)

现在我们试图签下基努

CREATE (Keanu)-[:ACTED_IN {roles:['Dev']} ]->(RaiseOfCrazyDev)

但它应该失败,因为Keanu讨厌JackN,并且Kianu需要LillyW

所以我们删除了JackN,添加了Keanu和LillyW,而不是

MATCH (:JackN)-[r:ACTED_IN]-(:RaiseOfCrazyDev) DELETE r
CREATE (Keanu)-[:ACTED_IN {roles:['Dev']} ]->(RaiseOfCrazyDev),
(LillyW)-[:ACTED_IN {roles:['StepSister']} ]->(RaiseOfCrazyDev)

但现在它又失败了,因为JamesM讨厌LillyW

由于基努是我们电影中的主要角色,我们解雇了詹姆斯

MATCH (:JamesM)-[r:ACTED_IN]-(:RaiseOfCrazyDev) DELETE r

所以,如果换个说法:

  • 一部电影的任何两个演员之间都不应该有仇恨关系
  • 对于所有演员来说,他们需要的关系也应该是这部电影中的演员

问题:进行此类条件检查的最佳方式和地点是什么?

我假设DB中不存在以下问题情况:a需要bb需要c,但c讨厌a。(尽管现实生活中可能存在这样的情况:-(。我还假设actor节点具有Actor标签和name属性。

这个查询应该会让你开始。它会告诉您是否可以添加actor(我假设actorNametitle是作为参数传递的(。它还将返回一个由"所需"演员反对的当前演员列表(包括您要添加的主要演员,以及所需演员所需的所有演员等(,以及一个由当前演员反对的所需演员列表:

MATCH (a:Actor {name: $actorName}), (m:Movie {title: $title})
OPTIONAL MATCH p=(a)-[:REQUIRE*]->(:Actor)
WITH a, m, NODES(p) AS reqs
UNWIND reqs AS req
WITH DISTINCT a, m, reqs, req
OPTIONAL MATCH (req)-[:HATE]->(h:Actor)
WITH a, m, reqs, COLLECT(DISTINCT h) AS hatedByReq
OPTIONAL MATCH (m)<-[:ACTED_IN]-(x:Actor)
OPTIONAL MATCH (x)-[:HATE]->(y:Actor)
WITH a, m, reqs, hatedByReq, COLLECT(x) AS cast, COLLECT(DISTINCT y) AS hatedByCast
WITH a, m, [c IN cast WHERE c IN hatedByReq] AS reqOpposes, [r IN reqs WHERE r IN hatedByCast] AS castOpposes
RETURN a, m, reqOpposes, castOpposes, (SIZE(reqOpposes) = 0 AND SIZE(castOpposes) = 0) AS okToAddActors

使用您的样本数据,结果是:

╒════════════════╤══════════════════════════════════════════════════════════════════════╤══════════════════╤═══════════════════╤═══════════════╕
│"a"             │"m"                                                                   │"reqOpposes"      │"castOpposes"      │"okToAddActors"│
╞════════════════╪══════════════════════════════════════════════════════════════════════╪══════════════════╪═══════════════════╪═══════════════╡
│{"name":"Keanu"}│{"title":"RaiseOfCrazyDev","tagline":"Crazy developer  conquer the wor│[{"name":"JackN"}]│[{"name":"LillyW"}]│false          │
│                │ld","released":2020}                                                  │                  │                   │               │
└────────────────┴──────────────────────────────────────────────────────────────────────┴──────────────────┴───────────────────┴───────────────┘

最新更新