如何验证Neo4j Graph DB是否与Python一起存在?

时间:2011-11-18 21:30:35

标签: python neo4j neo4j.py

我有一小段代码,用于在嵌入式Neo4j数据库中加载文件。

使用这段代码我有两个问题,我找不到解决它的文档。

我正在关注文档示例以创建索引,但是: a)如何检测索引是否存在?文档说明如果索引已经存在, 它被返回了,但在我的情况下它会返回一个错误。

b)当我从索引中获取一个节点时,我得到一个错误

from neo4j import GraphDatabase, INCOMING, Evaluation

# Create a database
db = GraphDatabase("c:/temp/graph")

with db.transaction:
    # Create an index for "users" nodes
    # to look for them using some of the properties  

    # HERE I GET AN ERROR WHEN THE INDEX EXISTS PREVIOUSLY, BUT THE DOCUMENTATION EXPLAINS THE OPOSITE.
    users_idx = db.node.indexes.create('users')

    # Create the "users_reference" node to connect all "users" nodes to here
    users_reference = db.node()
    db.reference_node.USERS(users_reference, provider='lucene', type='fulltext')

    '''
    Content of the file
    1,Marc
    2,Didac
    3,Sergi
    4,David
    '''

    f = open("../files/users","r")
    for line in f:
        v = line.split(",")
        i = v[0]
        name = v[1]

        # All write operations happen in a transaction
        user = db.node(id=i, name=name)
        user.INSTANCE_OF(users_reference)
        users_idx['id'][i] = user

# I suppose that here, the transaction is closed

# I want get the node whose property "Id" has value "3" 
# to print the property "name" of the node with id = 3

# HERE I GET AN ERROR WHEN THE THERE'RE MULTIPLE NODES WITH THE SAME VALUE FOR THE PROPERTY "ID"

c = users_idx['id']['3'].single
print c['name']                

'''
If the file has a duplicated ID, the previouly code returns an error... 
1,Marc
1,Marc_2
1,Marc_3
2,Didac
3,Sergi
4,David
'''    

# Always shut down your database when your application exits
db.shutdown()

1 个答案:

答案 0 :(得分:2)

在您的第一个示例中,文档错误。目前只有一种方法可以确定索引是否存在,并且在获取索引时检查是否存在ValueError。像这样:

try:
    idx = db.node.indexes.get('my_index')
except ValueError,e:
    idx = db.node.indexes.create('my_index')

这应该更改为一些更具体的异常,因为如果其他东西触发了ValueError,这个模式会中断..会为此添加一个问题。

我刚刚对文档进行了更新,我添加了一个“exists”方法来检查索引是否存在。在下一个neo4j里程碑发布后,它将在Pypi上发布。

if db.node.indexes.exists('my_index'):
    db.node.indexes.get('my_index')
else:
    db.node.indexes.create('my_index')

在你的第二个例子中,我认为这是正确的行为。 “单一”属性确保只有一个结果。如果您期望单个结果,但得到多个,那就是错误。如果您想要第一个结果,您应该可以执行以下操作:

hits = iter(users_idx['id']['3'])
c = hits.next()
hits.close()