Gremlin Python:不可散列类型:'dict' 在边上使用 groupCount

Gremlin Python: unhashable type: 'dict' while using groupCount on edges

我正在尝试计算边介数。该查询在 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 中,键不能是映射本身,因此会引发此错误。

如何解决这个问题?另外请解释如何在 gremlin-python.

中使用 select(all, 'e')

您已 运行 进入 gremlinpython 的 limitations 之一,因为 Gremlin 可以 return 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,其中对中的第一个值是键,第二个是值。