我们有一个较小的示例twitter数据库:
user -[TWEETED]-> tweet -[MENTIONED]-> user2
我想了解如何在Gremlin中编写查询,其中显示谁是彼此提及的用户。我已经阅读了文档,但我不知道该怎么做。
答案 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
,以获得唯一的结果对