Gremlin Python: нехешируемый тип: 'dict' при использовании groupCount на краях

Я пытаюсь вычислить промежуточность. Запрос отлично работает в консоли gremlin, но не работает в gremlin-python.

g.V().as_("v").
  repeat(identity().as_("src").
         bothE().as_("e").
         bothV().as_("v").
         where(neq("src")).
         simplePath()).
    emit().
  filter(project("x","y","z").
           by(select(first, "v")).
           by(select(last, "v")).
           by(select("v").count(local)).as_("triple").
         coalesce(select("x","y").as_("a").
                  select("triples").unfold().as_("t").
                  select("x","y").
                  where(eq("a")).
                  select("t"),
                  store("triples")).
         select("z").as_("length").
         select("triple").
         select("z").
         where(eq("length"))).
   select('e').
   unfold().
   groupCount()

Ошибка: TypeError: unhashable type: 'dict'

Если я изменю его на межрешенность между вершинами, он будет работать нормально. Проблема, которую я чувствую, заключается в том, как в питоне извлекается край, это карта. Когда я делаю групповой подсчет, он также создает карту, которая имеет ключ в качестве края и значение в качестве счетчика. В python ключ не может быть картой и, следовательно, вызывает эту ошибку.

Как это исправить? Также объясните, как использовать select(all, 'e') в gremlin-python.


person Shubham Yadav    schedule 28.02.2020    source источник


Ответы (1)


Вы столкнулись с одним из ограничений gremlinpython в том, что Gremlin может вернуть dict значений, которые не могут существовать в Python. Вам нужно будет преобразовать эти ключи во что-то, что может существовать как ключ в Python, сохраняя при этом информацию, содержащуюся в ключе. У меня нет образца ваших данных или вывода, но в качестве демонстрации я придумал следующее:

gremlin> g.V().both().elementMap().groupCount().unfold()
==>{id=5, label=software, name=ripple, lang=java}=1
==>{id=2, label=person, name=vadas, age=27}=1
==>{id=4, label=person, name=josh, age=32}=3
==>{id=3, label=software, name=lop, lang=java}=3
==>{id=1, label=person, name=marko, age=29}=3
==>{id=6, label=person, name=peter, age=35}=1

С dict в качестве ключа это не будет работать в python, и мы получим ту же ошибку, что и вы сейчас. Существует множество вариантов преобразования этого результата во что-то, что может потреблять Python, но вот простой, чтобы вы задумались о том, что вы могли бы сделать:

gremlin> g.V().both().elementMap().groupCount().unfold().map(union(select(keys),select(values)).fold())
==>[[id:5,label:software,name:ripple,lang:java],1]
==>[[id:2,label:person,name:vadas,age:27],1]
==>[[id:4,label:person,name:josh,age:32],3]
==>[[id:3,label:software,name:lop,lang:java],3]
==>[[id:1,label:person,name:marko,age:29],3]
==>[[id:6,label:person,name:peter,age:35],1]

Выше я разбираю dict на list пар. Теперь на стороне клиента вы знаете, что каждый результат - это одна запись на стороне сервера dict, где первое значение в паре является ключом, а второе - значением.

person stephen mallette    schedule 28.02.2020