【问题标题】:How to create unique CONSTRAINT to relationship by neo4j cypher?如何通过 Neo4j 密码创建独特的关系约束?
【发布时间】:2014-05-12 13:35:47
【问题描述】:

如何通过 neo4j cypher 创建独特的 CONSTRAINT to relationship

【问题讨论】:

  • 我为什么要问这个问题,因为我看到了 (rest-api-unique-indexes)[docs.neo4j.org/chunked/stable/rest-api-unique-indexes.html] ,并认为在我使用这个 API 之前应该在具有特定的节点上创建唯一性约束标签,但我找不到如何在关系中创建唯一性约束!现在我看到'唯一关系'可以很好地运行并且不需要约束,也许它使用创建唯一!

标签: neo4j unique unique-constraint


【解决方案1】:

如果我正确理解了您的问题,您希望强制执行某种关系的唯一性,而不是关系的某个属性的唯一性。如果这就是您想要的,那么您可以使用“CREATE UNIQUE”来强制实现这种唯一性:

MATCH (root { name: 'root' })
CREATE UNIQUE (root)-[:LOVES]-(someone)
RETURN someone

The Neo4j Manual: Create unique relationships

【讨论】:

  • 链接已损坏。此外,在我看来,CREATE UNIQUE 不再有效。
  • @AlessandroFlati 链接又回来了,即使CREATE_UNIQUE 无效,您也可以使用链接中CREATE_UNIQUE 文档中列出的有效MERGE 替代方案。请注意,这更像是一种解决方法,因为它实际上并没有在节点和关系之间创建约束,而只是允许您在查询级别创建唯一的节点关系对。这意味着您必须避免意外创建应该是唯一的重复关系。
  • 具体而言,相关的MERGE 替代方案位于“简介”部分,它应该能让您很好地了解该做什么。
【解决方案2】:

似乎关系约束只能强制关系属性的存在,但不能强制其唯一性

CREATE CONSTRAINT ON ()-[like:LIKED]-() ASSERT exists(like.day)

http://neo4j.com/docs/developer-manual/current/cypher/#query-constraints-prop-exist-rels

【讨论】:

    【解决方案3】:

    目前只有一种CONSTRAINTneo4j 可以让你创建,那就是UNIQUENESS 约束。该链接引用了内部 API 中的内容,您会注意到目前只有一种类型。

    Here's a link on how to create a uniqueness constraint.

    这使您可以断言节点的某个属性必须是唯一的,但它没有说明任何关系。我认为不可能限制各种节点可以产生什么样的关系。

    【讨论】:

    • 谢谢!我为什么要问这个问题,因为我看到了(rest-api-unique-indexes),并认为在我使用这个 API 之前应该在节点上创建 唯一性约束特定标签,但我找不到如何在关系中创建唯一性约束([创建唯一关系](docs.neo4j.org/chunked/stable/…))!现在我看到'唯一关系'可以很好地运行并且不需要约束,也许它使用Create Unique
    【解决方案4】:

    虽然您目前还不能将其作为约束来执行,但您可以使用以下变通方法在查询级别(而不是约束级别)通过在查询中使用 MERGE 来获得类似的行为。您曾经可以使用CREATE UNIQUE 来执行此操作,但此后已被弃用,但CREATE UNIQUE 文档here 有一个很好的介绍部分,它很好地涵盖了细节,并向您展示了如何在非弃用 MERGE 方式。

    因此,您可以使用这些文档了解如何通过使用 MERGE 的查询创建唯一节点和关系。此外,由于这种唯一性是在查询级别而不是约束级别决定的,因此您应该非常小心,以免在应该唯一的地方意外创建重复数据。

    (我会将上面为CREATE UNIQUE 提供的当前相关文档部分与MERGE 替代品放在此处,以防它们消失。)

    CREATE UNIQUE 位于MATCHCREATE 的中间 — 它将匹配它可以匹配的内容,并创建缺少的内容。

    我们在下面的示例中展示了如何使用MERGE 表达由CREATE UNIQUE 保证的节点和关系的相同级别的唯一性。

    假设原始查询集由下式给出:

    MERGE (p:Person {name: 'Joe'})
    RETURN p
    
    MATCH (a:Person {name: 'Joe'})
    CREATE UNIQUE (a)-[r:LIKES]->(b:Person {name: 'Jill'})-[r1:EATS]->(f:Food {name: 'Margarita Pizza'})
    RETURN a
    
    MATCH (a:Person {name: 'Joe'})
    CREATE UNIQUE (a)-[r:LIKES]->(b:Person {name: 'Jill'})-[r1:EATS]->(f:Food {name: 'Banana'})
    RETURN a
    

    这将创建两个:Person 节点,它们之间的:LIKES 关系,以及从:Person 节点之一到两个:Food 节点的两个:EATS 关系。没有节点或关系重复。

    以下查询集 — 使用MERGE — 将获得相同的结果:

    MERGE (p:Person {name: 'Joe'})
    RETURN p
    
    MATCH (a:Person {name: 'Joe'})
    MERGE (b:Person {name: 'Jill'})
    MERGE (a)-[r:LIKES]->(b)
    MERGE (b)-[r1:EATS]->(f:Food {name: 'Margarita Pizza'})
    RETURN a
    
    MATCH (a:Person {name: 'Joe'})
    MERGE (b:Person {name: 'Jill'})
    MERGE (a)-[r:LIKES]->(b)
    MERGE (b)-[r1:EATS]->(f:Food {name: 'Banana'})
    RETURN a
    

    我们注意到,所有这些查询也可以组合成一个更大的查询。

    下面的CREATE UNIQUE 示例使用下图:

    --- 来源:Cypher Manual v3.5: Section 3.18, Introduction

    【讨论】:

      【解决方案5】:

      与 Neo4j 社区版 2.3.1 版一样,似乎对关系没有限制。

      
         neo4j-sh (?)$ schema ls
      Indexes
        ON :RELTYPE(id)  ONLINE (for uniqueness constraint)
      Constraints
        ON (reltype:RELTYPE) ASSERT reltype.id IS UNIQUE
      

      您可以轻松地创建多个类型为 RELTYPE 且全局具有相同 ID 的关系,甚至可以在相同节点之间创建多个关系

      MATCH (s:Person {name:"foo"}),  (t:Target {name:"target"})
      CREATE  (s)-[r:RELTYPE {id:"baz"}]-(t)
      

      这个约束似乎只适用于节点,我在 neo4j 文档中找不到任何提及关系的内容

      http://neo4j.com/docs/stable/rest-api-schema-constraints.html

      【讨论】:

        【解决方案6】:

        我希望看到(但从我对Neo4J documentation 的阅读来看,目前不可能)是约束(例如)ACTED_IN 关系:

        (:Person)-[ACTED_IN]->(:Movie)

        防止错误的关系:

        (:Movie)-[ACTED_IN]->(:Person)

        显然,您可以通过这种方式找到不好的反向关系,但最好通过约束来防止它发生:

        match((m:Movie)-[:ACTED_IN]->(p:Person)) return m,p

        【讨论】:

          猜你喜欢
          • 2014-01-23
          • 1970-01-01
          • 1970-01-01
          • 2016-05-14
          • 1970-01-01
          • 1970-01-01
          • 2012-09-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多