Атрибуты метаданных OrientDB
Я пытаюсь orientdb с Python. Я создал пару вершин и заметил, что если я добавлю к имени их свойств знак @, то при поиске их в веб-приложении estudio эти свойства появятся в разделе метаданных. Это интересно, поэтому я пошел и попытался запросить фильтрацию вершин по идентификатору свойства метаданных, который я создал. При этом:
select from V where @id = somevalue
Я получаю огромное сообщение об ошибке. Я не мог найти способ запроса этих пользовательских свойств метаданных.
1 ответ
Ваша проблема с python/pyorient (я предполагаю, что вы используете pyorient, основываясь на других ваших вопросах).
Pyorient пытается сопоставить поля базы данных с атрибутами объекта, но в документации по Python сказано the valid characters for identifiers are the same as in Python 2.x: the uppercase and lowercase letters A through Z, the underscore _ and, except for the first character, the digits 0 through 9.
(источник). Таким образом, вы не можете использовать '@' в качестве имени поля и ожидать, что pyorient будет работать.
Я быстро взглянул на исходный код pyorient, и оказалось, что проблема еще больше, чем выше... pyorient / types.py
elif key[0:1] == '@':
# special case dict
# { '@my_class': { 'accommodation': 'hotel' } }
self.__o_class = key[1:]
for _key, _value in content[key].items():
self.__o_storage[_key] = _value
Таким образом, pyorient предполагает, что любое поле записи, начинающееся с символа '@', сопровождается именем класса / кластера, а затем указанием полей. Я полагаю, вы могли бы отправить сообщение в очередь проблем с пиориентами и предложить, чтобы вышеприведенный раздел elif проверял, content[key]
это диктат или "простая ценность". Если это был dict, он должен обрабатываться так, как он есть в настоящее время, в противном случае он должен обрабатываться как поле, но удалить из него символ @.
В конечном итоге, не использовать символ @ в именах полей будет самым простым решением.