如何使用 py2neo 声明唯一约束

How to declare a unique contraint with py2neo

我需要对我的图形数据库实施唯一约束。我找到了以下方法:

graph.schema.create_uniqueness_constraint("Website", "url") 

但它会产生以下错误:

graph.schema.create_uniqueness_constraint("Website", "url")
AttributeError: 'Schema' object has no attribute 'create_uniqueness_constraint' 

我的导入和图表实例化是:

from py2neo import neo4j,node 
graph = neo4j.GraphDatabaseService("http://localhost:7474/db/data/") 

我做错了什么,我该如何解决?

此外,使用 py2neo 添加唯一性约束的最简单、最干净的方法是什么?

我对大量的方法感到困惑,有时这些方法似乎无缘无故地失败了(找不到关于 py2neo 的综合教程),我开始觉得我最好还是编写原始的 Cypher 查询...

看来您使用的是 py2neo 版本 1.x 并且正在阅读 2.0 版的文档。在 py2neo 2.0 中:

from py2neo import Graph
graph = Graph()
graph.schema.create_uniqueness_constraint('Website', 'url')

在 py2neo 1.x 中,我不确定是否有创建唯一性约束的方法。您可能必须这样做:

from py2neo import neo4j
graph = neo4j.GraphDatabaseService("http://localhost:7474/db/data/") 
neo4j.CypherQuery(graph, 'CREATE CONSTRAINT ON (w:Website) ASSERT w.url IS UNIQUE;').run()

编辑:根据下面评论中的问题进行更新。 OP 在 py2neo 2.0 上。

Neo4j 不允许您在不指定标签的情况下创建唯一性约束。然而,这在 py2neo 中很容易实现。您可以使用 graph.node_labels 获取图表中所有标签的列表,然后您可以迭代这些标签并使用给定的 属性:

在每个标签上创建唯一性约束
from py2neo import Graph
graph = Graph()

labels = graph.node_labels

for label in labels:
    graph.schema.create_uniqueness_constraint(label, 'url')

请注意,如果约束已经存在,这将失败并显示 py2neo.error.ConstraintViolationException;你可能想把它包装在一个 try-except:

for label in labels:
    try:
        graph.schema.create_uniqueness_constraint(label, 'url')
    except:
        pass