在Gremlin中相互提及的用户

在Gremlin中相互提及的用户,gremlin,Gremlin,我们有一个较小的示例twitter数据库: user -[TWEETED]-> tweet -[MENTIONED]-> user2 我想了解如何用Gremlin编写一个查询,显示谁是相互提及的用户。我已经阅读了文档,但我不知道怎么做。鉴于此示例数据,假设marko和stephen相互提及,marko和daniel相互提及: g = new TinkerGraph() vMarko = g.addVertex("marko", [type:"user"]) vStephen = g

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

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

我想了解如何用Gremlin编写一个查询,显示谁是相互提及的用户。我已经阅读了文档,但我不知道怎么做。

鉴于此示例数据,假设marko和stephen相互提及,marko和daniel相互提及:

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”(最终位置的顶点)的步骤。这当然意味着检测到循环模式,其中一个用户提到了另一个用户,而另一个用户在某个点上又提到了那个人

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

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]

通过在前面的代码中添加一个
transform
,我们可以将结果转换为“id”(本例中的用户名),并将所有内容翻转到
Set
,以获得唯一的结果对。

因此,您还需要一个“user2 tweet that noted user”来实现用户和user2相互提及的场景,对吗?是的,没错,但是用户发了推特。。。line只想向您展示“模式”一个“额外”:如果我们只需要那些彼此不认识的人怎么办?在SQL中,这类似于“不在”或“负”你是说,某人提到了某人,但从未回过他们?我的意思是在模式中“添加另一个关系”,比如:user1-Knows->user2,使用这个,我想添加一个限制,即-user1提到了user2,反之亦然-user1不知道user2,反之亦然,可能只是在
之后扩展
过滤器
来检查“Knows”边
.filter{it[0]==it[2]&&!it[0]。两者('knows')。保留([it[1]])。hasNext()}