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'})
并开始铸造。首先我们签署JackN和JamesM
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
需要b
,b
需要c
,但c
讨厌a
。(尽管现实生活中可能存在这样的情况:-(。我还假设actor节点具有Actor
标签和name
属性。
这个查询应该会让你开始。它会告诉您是否可以添加actor(我假设actorName
和title
是作为参数传递的(。它还将返回一个由"所需"演员反对的当前演员列表(包括您要添加的主要演员,以及所需演员所需的所有演员等(,以及一个由当前演员反对的所需演员列表:
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} │ │ │ │
└────────────────┴──────────────────────────────────────────────────────────────────────┴──────────────────┴───────────────────┴───────────────┘