gremlin python - добавить несколько, но неизвестное количество свойств в вершину - PullRequest
1 голос
/ 14 июня 2019

Я хочу добавить более одного свойства в вершину, но с самого начала не знаю явно, что это могут быть за свойства.Например, скажем, что для добавления одного человека в качестве вершины графа у нас есть следующий словарь свойств:

Персона 1

{
    "id": 1,
    "first_name": "bob",
    "age": 25,
    "height": 177
}

Может быть для другой вершиныдля добавления, человек имеет следующие свойства:

Человек 2

{
    "id": 2,
    "first_name": "joe",
    "surname": "bloggs",
    "occupation": "lawyer",
    "birthday": "12 September"
}

Есть ли способ добавить обоих людей в график без явного жесткого кодирования свойстваключи и значения в функции Gremlin свойство ?

Эта ссылка дает ответ в правильном направлении.Дополнительную полезную информацию можно найти здесь .Следующая строка отражает предлагаемое решение, выполняется, как ожидается, и добавляет новую вершину в график.Отлично.

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 вычислительным способом?


Обновление: naive /неэффективное решение

Ниже представлено решение, но это плохое решение, потому что на каждой итерации он запрашивает сервер 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 в данном контексте следует импортировать из столбцаenum - в исходном коде здесь .

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()

1 Ответ

1 голос
/ 15 июня 2019

Вы можете вставить свои карты / словари в обход, создать вершину для каждого словаря, а затем просмотреть все записи словаря / карты и установить их в качестве свойств.В Гремлин это выглядит так:

g.inject(persons).unfold().as('person').
  addV('person').as('v').
  sideEffect(select('person').unfold().as('kv').
             select('v').
               property(select('kv').by(keys), select('kv').by(values))).
  iterate()

Пример:

gremlin> persons = [["id":1,"first_name":"bob","age":25,"height": 177]
......1>           ,["id":2,"first_name":"joe","surname":"bloggs",
                       "occupation":"lawyer","birthday":"12 September"]]
==>[id:1,first_name:bob,age:25,height:177]
==>[id:2,first_name:joe,surname:bloggs,occupation:lawyer,birthday:12 September]

gremlin> g = TinkerGraph.open().traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.inject(persons).unfold().as('person').
......1>   addV('person').as('v').
......2>   sideEffect(select('person').unfold().as('kv').
......3>              select('v').
......4>                property(select('kv').by(keys), select('kv').by(values))).
......5>    valueMap()
==>[id:[1],first_name:[bob],age:[25],height:[177]]
==>[birthday:[12 September],occupation:[lawyer],surname:[bloggs],id:[2],first_name:[joe]]
...