Gremlin找到所有'人'到'人'的联系

时间:2018-03-28 10:39:27

标签: gremlin

示例数据:Tinker Modern

enter image description here

查询:

g.V()
.hasLabel("Person")
.bothE().bothV()
.hasLabel("Person")
.path()
.by(label())

结果:

['Person', 'knows', 'Person']
['Person', 'knows', 'Person']
['Person', 'created', 'Person']
['Person', 'knows', 'Person']
['Person', 'knows', 'Person']
['Person', 'knows', 'Person']
['Person', 'knows', 'Person']
['Person', 'created', 'Person']
['Person', 'created', 'Person']
['Person', 'knows', 'Person']
['Person', 'knows', 'Person']
['Person', 'created', 'Person']

此结果不应包含“已创建”边缘,因为这是针对软件的人

1 个答案:

答案 0 :(得分:3)

我重写了你的遍历:

g.V().
  hasLabel("person").
  bothE().bothV().
  hasLabel("person").
  path().
    by(label)

我认为您可以期待看到"创建" edge因为你遍历bothE(),意味着你从一个" person"开始,并遍历传入和传出边缘。这些边缘可能是"创建的#34;边缘。然后,你执行bothV(),这意味着从这些边的源和目标遍历。由于其中一些边缘被创建了#34;边缘他们将有一个"人"在一边("人和#34;你开始的顶点)和一个"软件"在另一。

如果我们看一个人,也许更有意义:

gremlin> g.V().has('person','name','marko').bothE('created').bothV().label()
==>person
==>software

请注意,当我们遍历"创建"边缘并做bothV()我们得到一个"人" (即marko)和一个"软件"。如果我们添加一个过滤器来摆脱"软件":

gremlin> g.V().has('person','name','marko').bothE('created').bothV().hasLabel('person').values('name')
==>marko

我们最终得到了" marko"。在你的遍历中也会发生同样的事情。如果你想过滤掉"软件"然后你应该使用边缘标签更具体:

gremlin> g.V().
......1>   hasLabel("person").
......2>   bothE("knows").bothV().
......3>   hasLabel("person").
......4>   path().
......5>     by(label)
==>[person,knows,person]
==>[person,knows,person]
==>[person,knows,person]
==>[person,knows,person]
==>[person,knows,person]
==>[person,knows,person]
==>[person,knows,person]
==>[person,knows,person]

或许您不需要bothV()

gremlin> g.V().
......1>   hasLabel("person").
......2>   bothE().otherV().
......3>   hasLabel("person").
......4>   path().
......5>     by(label)
==>[person,knows,person]
==>[person,knows,person]
==>[person,knows,person]
==>[person,knows,person]

或有点奇怪,但你可以这样过滤边缘:

gremlin> g.V().
......1>   hasLabel("person").
......2>   bothE().filter(bothV().hasLabel('person').count().is(2)).bothV().
......3>   path().
......4>     by(label)
==>[person,knows,person]
==>[person,knows,person]
==>[person,knows,person]
==>[person,knows,person]
==>[person,knows,person]
==>[person,knows,person]
==>[person,knows,person]
==>[person,knows,person]

无论如何,这应该是你需要考虑的足够的例子 - 我确定还有其他方法可以使这项工作。