Как проверить, существует ли база данных Neo4j Graph с Python? - PullRequest
2 голосов
/ 19 ноября 2011

У меня есть небольшой фрагмент кода, который загружает файл во встроенную базу данных Neo4j.

С этим кодом у меня две проблемы, и я не могу найти документацию для их решения.

Я следую образцам документации для создания индекса, но: а) Как я могу определить, существует ли индекс еще?Документация объясняет, что если индекс уже существует, он возвращается, но в моем случае он возвращает ошибку.

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 Ответ

2 голосов
/ 19 ноября 2011

В вашем первом примере документация неверна.В настоящее время существует только один способ определить, существует ли индекс, и это проверить ValueError при получении индекса.Как это:

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

Это должно быть изменено на более конкретное исключение, так как этот шаблон ломается, если что-то еще вызывает ValueError .. Я добавлю проблему для этого.

У меня естьтолько что отправил обновление в документацию, и я добавил метод «существует», чтобы проверить, существует ли индекс.Он будет доступен на Pypi после следующего выпуска neo4j.

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

Во втором примере я думаю, что это правильное поведение.Свойство «single» гарантирует, что результат будет единственным.Если вы ожидаете один результат, но получаете несколько, это ошибка.Если вам нужен результат first , вы можете сделать что-то вроде:

hits = iter(users_idx['id']['3'])
c = hits.next()
hits.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...