Я хочу добавить к вершине более одного свойства, но с самого начала не знаю, какими могут быть эти свойства. Например, предположим, что для добавления одного человека в качестве вершины к графу у нас есть следующий словарь свойств:
Человек 1
{
"id": 1,
"first_name": "bob",
"age": 25,
"height": 177
}
Может быть, для добавления еще одной вершины у человека есть следующие свойства:
Человек 2
{
"id": 2,
"first_name": "joe",
"surname": "bloggs",
"occupation": "lawyer",
"birthday": "12 September"
}
Есть ли способ добавить обоих людей в график без явного жесткого кодирования ключей и значений свойств в функции Gremlin property?
Эта ссылка дает правильный ответ. Дополнительную полезную информацию можно найти здесь. Следующая строка отражает предложенное решение, выполняется, как ожидалось, и добавляет новую вершину в граф. Большой.
g.addV("person").property("id", 1, "first_name", "bob", "age", 25, "height", 177).next()
НО, он работает только в том случае, если входы жестко запрограммированы. Я преобразовал словари свойств в набор значений в форме (k1, v1, k2, v2, ..., kn, vn), но я не могу программно передать значения. Например.
tup_vals = ("id", 1, "first_name", "bob", "age", 25, "height", 177)
Но по какой-то причине я не могу позвонить:
g.addV("person").property(*tup_vals).next()
Вышеупомянутая строка не генерирует исключение, она просто не выполняется так, как ожидалось (т.е. свойства не передаются)
Есть ли у кого-нибудь представление о том, как передать эти словари свойств в функцию свойств Gremlin вычислительным способом?
Обновление: наивное / неэффективное решение
Решение представлено ниже, но это плохое решение, потому что на каждой итерации он запрашивает сервер gremlin. В идеале я хочу добавить все свойства одновременно. И действительно работает так, как ожидалось, только если идентификатор уникален.
g.addV("person").property('id', id).next()
for k,v in property_dictionary[id].items():
g.V().has('id', id).property(k, v).iterate()
Ответ
Спасибо Даниэлю за ответ. Я адаптировал его ответ (ниже) в соответствии с пакетом gremlin_python.
Важное примечание из этого ответа: keys
и values
в данный контекст должен быть импортирован из перечисления Column - в исходном коде здесь.
from gremlin_python.process.graph_traversal import __
from gremlin_python.process.traversal import Column
persons = [{"id":1,"first_name":"bob","age":25,"height": 177}, {"id":2,"first_name":"joe","surname":"bloggs","occupation":"lawyer","birthday":"12 September"}]
g.inject(persons).unfold().as_('entity').\
addV('entity').as_('v').\
sideEffect(__.select('entity').unfold().as_('kv').select('v').\
property(__.select('kv').by(Column.keys),
__.select('kv').by(Column.values)
)
).iterate()