如何用py2neo声明一个独特的约束

bsu*_*ire 2 python neo4j cypher py2neo

我需要在我的图形数据库上强制执行一个独特的约束.我找到了以下方法:

graph.schema.create_uniqueness_constraint("Website", "url") 
Run Code Online (Sandbox Code Playgroud)

但它会产生以下错误:

graph.schema.create_uniqueness_constraint("Website", "url")
AttributeError: 'Schema' object has no attribute 'create_uniqueness_constraint' 
Run Code Online (Sandbox Code Playgroud)

我的导入和图形插入是:

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

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

另外,用py2neo添加唯一性约束的最简单,最简洁的方法是什么?

我对丰富的方法感到困惑,有时似乎没有理由失败(无法找到关于py2neo的全面教程),我开始觉得我会更好地编写原始Cypher查询...

Nic*_*ite 6

看起来你正在使用py2neo 1.x版并阅读2.0版的文档.在py2neo 2.0中:

from py2neo import Graph
graph = Graph()
graph.schema.create_uniqueness_constraint('Website', 'url')
Run Code Online (Sandbox Code Playgroud)

在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()
Run Code Online (Sandbox Code Playgroud)

编辑:以下评论中的每个问题的更新.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')
Run Code Online (Sandbox Code Playgroud)

请注意,py2neo.error.ConstraintViolationException如果约束已存在,则会失败; 你可能想把它包装在try-except中:

for label in labels:
    try:
        graph.schema.create_uniqueness_constraint(label, 'url')
    except:
        pass
Run Code Online (Sandbox Code Playgroud)