如何使用py2neo声明唯一约束

时间:2015-04-11 15:53:55

标签: python neo4j cypher 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查询...

1 个答案:

答案 0 :(得分:6)

看起来您正在使用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