Database design 防止基于节点属性创建新关系

Database design 防止基于节点属性创建新关系,database-design,neo4j,cypher,Database Design,Neo4j,Cypher,我正在尝试使用Neo4j创建一个图形,它可以建立城市和街道之间的关系。可以有多条同名街道,属于不同的城市,但唯一的限制是一个城市不能有两条同名街道。假设我有下一个场景: 在这里,我使用具有相同街道名称的Cypher创建了两个街道节点: (st1: Street { streetName: 'streetName1'}), (st2: Street { streetName: 'streetName1'}), 在这里,我创建了一个城市节点: (city1: City { cityName: 'c

我正在尝试使用Neo4j创建一个图形,它可以建立城市和街道之间的关系。可以有多条同名街道,属于不同的城市,但唯一的限制是一个城市不能有两条同名街道。假设我有下一个场景:

在这里,我使用具有相同街道名称的Cypher创建了两个街道节点:

(st1: Street { streetName: 'streetName1'}),
(st2: Street { streetName: 'streetName1'}),
在这里,我创建了一个城市节点:

(city1: City { cityName: 'cityName1'}),
我知道st1属于城市1,所以我创建了它们之间的关系:

(st1)-[:BELONGS_TO]->(city1)
我的问题是:鉴于我在图表中已经有了这种关系,是否有任何方法可以防止在city1和任何其他街道节点之间创建一种新的关系,这种关系的
streetName
属性为“
streetName1
”,如下所示

(st2)-[:BELONGS_TO]->(city1)

以下示例说明了当且仅当城市尚未具有同名街道时,如何创建街道并将其链接到城市:

MATCH (city1:City {name: 'Foo'})
OPTIONAL MATCH (st:Street {streetName: 'streetName1'})-[:BELONGS_TO]->(city1)
FOREACH(x IN CASE WHEN st IS NULL THEN [1] END |
  CREATE (st2:Street {streetName: 'streetName1'})-[:BELONGS_TO]->(city1))

以下示例说明了当且仅当城市尚未具有同名街道时,如何创建街道并将其链接到城市:

MATCH (city1:City {name: 'Foo'})
OPTIONAL MATCH (st:Street {streetName: 'streetName1'})-[:BELONGS_TO]->(city1)
FOREACH(x IN CASE WHEN st IS NULL THEN [1] END |
  CREATE (st2:Street {streetName: 'streetName1'})-[:BELONGS_TO]->(city1))

不幸的是,没有办法阻止创建您描述的新关系。您可能需要在创建关系和有条件地创建关系之前进行检查。不幸的是,没有办法阻止创建您描述的新关系。您可能需要在创建关系和有条件地创建关系之前进行检查。