在Gremlin中互相提及的用户

时间:2015-05-15 17:38:52

标签: gremlin

我们有一个较小的示例twitter数据库:

user -[TWEETED]-> tweet -[MENTIONED]-> user2

我想了解如何在Gremlin中编写查询,其中显示谁是彼此提及的用户。我已经阅读了文档,但我不知道该怎么做。

1 个答案:

答案 0 :(得分:2)

鉴于此样本数据假设marko和stephen互相提及而marko和daniel互相提及:

realpath

您可以使用以下方法处理它:

g = new TinkerGraph()
vMarko = g.addVertex("marko", [type:"user"])
vStephen = g.addVertex("stephen", [type:"user"])
vDaniel = g.addVertex("daniel", [type:"user"])
vTweetm1s = g.addVertex("m1s", [type:"tweet"])
vTweetm2d = g.addVertex("m2d", [type:"tweet"])
vTweets1m = g.addVertex("s1m", [type:"tweet"])
vTweetd1m = g.addVertex("d1m", [type:"tweet"])

vMarko.addEdge("tweeted",vTweetm1s)
vMarko.addEdge("tweeted",vTweetm2d)
vStephen.addEdge("tweeted",vTweets1m)
vDaniel.addEdge("tweeted",vTweetd1m)
vTweetm1s.addEdge("mentioned", vStephen)
vTweetm2d.addEdge("mentioned", vDaniel)
vTweets1m.addEdge("mentioned", vMarko)
vTweetd1m.addEdge("mentioned", vMarko)

此方法使用gremlin> g.V.has("type","user").as('s') .out("tweeted").out("mentioned").as('m').out("tweeted") .out("mentioned").as('e').select.filter{it[0]==it[2]} ==>[s:v[daniel], m:v[marko], e:v[daniel]] ==>[s:v[stephen], m:v[marko], e:v[stephen]] ==>[s:v[marko], m:v[stephen], e:v[marko]] ==>[s:v[marko], m:v[daniel], e:v[marko]] 从标记的步骤中提取数据,然后使用最终select来查找“s”(第一个位置的顶点)等于“e”(顶点)的数据在最后的位置)。这当然意味着检测到循环模式,其中一个用户提到了另一个用户,而另一个用户提到了那个人。

如果您遵循那么多,那么我们可以稍微清理一下结果,以获得唯一的一对:

filter

通过在前面的代码中添加gremlin> g.V.has("type","user").as('s') .out("tweeted").out("mentioned").as('m') .out("tweeted").out("mentioned").as('e') .select.filter{it[0]==it[2]} .transform{[it[0].id,it[1].id] as Set}.toList() as Set ==>[daniel, marko] ==>[stephen, marko] ,我们可以将结果转换为“id”(在这种情况下是用户的名称),并将所有内容翻转到transform,以获得唯一的结果对