是否可以在子图上添加约束?我有一个属于类别的项目的树型结构:
(cat:Category)<-[:OF_TYPE]-(item:Item {name:'foo'})
我希望共享相同类别的每个项目的名称都是唯一的,但是不同类别的项目节点应该能够具有相同的名称。这可以通过约束来强制执行吗?
答案 0 :(得分:2)
不幸的是,Neo4j目前还没有这样的功能 您只能为整个数据库创建约束。
备选方案:
您可以创建注册TransactionEventHandler
的{{3}}。这个将负责检查您的特定域约束并拒绝无效的事务。
您可以更改域名以使其可用。例如,为“dog”类别下的每个项目添加DogCategoryItem
标签。然后仅为DogCategoryItem
添加单独的约束。
注意:我不确定在数据库中有很多约束是好还是坏(但我的猜测 - 不会发生任何可怕的事情)。
答案 1 :(得分:2)
正如FylmTM所提到的,开箱即用是不可能的。但是,您可以通过将复合属性作为类别名称和项目名称的串联来轻松实现此目的。
例如,您可以在Item节点上添加reference
属性,该属性对于类别名称+项目名称连接应该是唯一的
CREATE CONSTRAINT ON (i:Item) ASSERT i.reference IS UNIQUE
创建项目时,需要创建此引用属性值。正如您将匹配用于创建关系的“类别”节点,这不是什么大问题:
MATCH (c:Category {name:"Category1"})
CREATE (i:Item {name:"Item1"})
SET i.reference = c.name + i.name
MERGE (i)-[:OF_TYPE]->(c)
如果您尝试在同一类别中创建另一个具有相同名称的项目,则由于唯一约束
将失败