Gremlin Python: недоступный тип: 'dict' при использовании groupCount по краям - PullRequest
1 голос
/ 28 февраля 2020

Я пытаюсь вычислить грань между ними. Запрос отлично работает на консоли 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, это карта. Когда я делаю счет группы, он также создает карту, ключ которой является краем, а значение - счетчиком. В python ключом не может быть сама карта, поэтому он выдает эту ошибку.

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

1 Ответ

2 голосов
/ 28 февраля 2020

Вы столкнулись с одним из ограничений от gremlin python в том, что 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, где первое значение в паре является ключом, а второе - значением.

...