Добавление вершины графа непосредственно в CosmosDB в формате GraphSON с использованием gremlinpython
Я использую gremlinpython для подключения к графику CosmosDB и хотел бы иметь возможность напрямую добавлять вершину, используя отформатированный словарь GraphSON. В частности, я хотел бы избежать необходимости динамически создавать запрос gremlin, такой как:
"g.addV('person').property(...)..."
и вместо этого запустите что-то вроде:
my_dict = {'id':'something', 'label':'person', 'outE':{}, 'properties':{}}
_gremlin_insert_vertex = "g.addV('person').use_my_graphson_dict({})".format(my_dict)
callback = client.submitAsync(_gremlin_insert_vertex)
Или что-то в этом роде. Портал Azure содержит JSON-представление вершин из выполняемого мной запроса (например, "g.V()"
), но я хотел бы иметь возможность получить это в Python, используя gremlinpython, сделать обновления, а затем отправить JSON-запрос обратно для обновления или добавления вершины. Кажется, я не могу найти какую-либо документацию о том, как конвертировать между объектами или запросами GraphSON dict и gremlin.
1 ответ
В Gremlin такого API просто нет. У него нет шага, который может принять GraphSON или Dictionary
(Map
в Java), чтобы преобразовать его в property()
шаги. В течение многих лет в сообществе TinkerPop велась значительная дискуссия на эту тему, поскольку удобство такого шага для пользователя, пожалуй, высоко, особенно в контексте, который вы описываете. К сожалению, представляя Map
не очень хорошо вписывается в API, так как он изначально выглядит, поскольку не позволяет должным образом настроить мульти-свойства, если подпись шага не приняла Map<Object,List<Object>>
(т.е. в Python, Dictionary
где ключ String
или же T
и значение является List
произвольных объектов), который является более сложным для построения и рассуждений о. Более того, этот API плохо учитывает мета-свойства, если рассматривать их в общем контексте их установки. Есть и другие аргументы против этого, но те, которые имеют тенденцию торчать в моей голове.
Что касается этапа принятия самого GraphSON (который, я полагаю, уменьшит некоторые проблемы, о которых я упоминал выше, с помощью multi/meta-свойств), я не думаю, что это когда-либо предлагалось. Я не уверен, как это будет работать, поскольку GraphSON является функцией операций ввода-вывода, а сам язык Gremlin просто никогда не знал об этом. IO - абстракция далеко от Гремлин, и я не знаю, хорошо ли она там подходила. Я также думаю, что большинство пользователей жаловались на сложность GraphSON (словари со встроенными списками или списками и т. Д.) И что создание GraphSON вручную нетривиально, и поэтому я сомневаюсь, что многие найдут такой API привлекательным для них. Мульти / мета-свойства снова бьют!:)
Я также сказал бы, что TinkerPop очень против создания строк Gremlin. Вы вынуждены сделать это сейчас в CosmosDB, поскольку они еще не поддерживают API байт-кода. С этой поддержкой (над которой они работают) вы больше не будете отправлять Gremlin как String
значение, но вместо этого напишите Gremlin на вашем любимом родном языке (в вашем случае Python). Таким образом, разработка путей, которые еще больше побуждают пользователей "создавать строки" любого типа, GraphSON или Gremlin, вероятно, не будет приветствоваться.
Теперь в Python вы можете создать этот метод самостоятельно как часть пользовательского DSL Gremlin, который в основном будет Dictionary
и преобразовать его в property()
звонки. Поскольку логика будет зависеть от вашего приложения, вы можете учитывать любые проблемы с мета / множеством свойств, которые могут возникнуть или не возникнуть. Вы можете прочитать больше о том, как создавать DSL, здесь и узнать больше о шаблонах для реализации в этой серии постов в блоге: Часть I, Часть II и Часть III.
Я думаю, что мы могли бы увидеть этот вид API, родной для Gremlin, в 4.x, когда растет популярность отказа от поддержки multi/meta-свойств, но до тех пор не было много хороших идей.
Это на год позже, так что к настоящему времени вы либо решили эту проблему, либо больше не заботитесь о потомках...
Вы можете использовать клиент sql python для своей коллекции графов и использовать метод вставки документа для отправки json, который имеет допустимую структуру Graphson для вершины:
Что-то вроде этого:
{
"label": "person",
"firstName": [{
"_value": "Thomas",
"id": "5267ec4b-a39e-4d77-8dea-668cb36307bc"
}],
"lastName": [{
"_value": "Andersen",
"id": "2e5271a6-ddd8-48b9-8ff6-be41e19f82f8"
}],
"age": [{
"_value": 44,
"id": "1c9a57cc-3324-4a0c-b4c3-d494fbb3fb81"
}],
"PartitionKey": "123",
"id": "a9b57684-16bf-47d9-8761-570bab43ca7b"
}
Некоторое время назад я писал об этом в блоге, хотя тестировал его только в.NET SDK.