或许这将激发你使用小鬼的解决方案。我将你的问题改编成标准的TinkerPop玩具图。我着手找出以下几点:
对于一个特定的顶点,发现所有它连接到顶点,然后各自如何在总集那些顶点都彼此相关。这听起来像你正在寻找你的描述。
于是我开始:
gremlin> g = TinkerGraphFactory.createTinkerGraph()
==>tinkergraph[vertices:6 edges:6]
gremlin> g.v(1).outE.as('x').inV.loop(2){it.loops<3}{true}.select
==>[x:e[7][1-knows->2]]
==>[x:e[8][1-knows->4]]
==>[x:e[9][1-created->3]]
==>[x:e[10][4-created->5]]
==>[x:e[11][4-created->3]]
对于顶点ID为1,让所有的出边,然后循环再次,要得到朋友边缘,最后选择了“X”的步骤的值。这让你至少知道子图是在g.v(1)附近,但是当我读到你的问题时,你想进一步将子图限制在与g.v(1)相连的顶点上。看看结果,e [10]确实不应该被包含,因为g.v(1)和g.v(5)之间没有边界。
我进一步细化查询,以消除来自子这种关系:
gremlin> x=[g.v(1)];g.v(1).out.aggregate(x).back(2).outE.filter{x.contains(it.inV.next())}.as('e').inV.loop(3){it.loops<3}{true}.select
==>[e:e[7][1-knows->2]]
==>[e:e[8][1-knows->4]]
==>[e:e[9][1-created->3]]
==>[e:e[11][4-created->3]]
所以上面基本上说,
- 初始化列表X将认为应持有的所有顶点在子图中。
- gv(1).out.aggregate(x)基本上把我想要的所有顶点放在子图中,除了我用
- 将它初始化的那个顶点追溯到遍历的开始并找出包含x中顶点的边,然后像以前那样循环它,并选择作为边列表的“e”步的值。
现在你可以看到e [10]不再在结果中。从这里你可以很容易地构建可视化输出。
不与朋友做赛后后者在声明'...'而是把它直接进入比赛阶段,比如'MATCH用户 - [:朋友] -firend- [连接:朋友] -friend2'。这对你有用吗? – ulkas 2013-03-01 08:50:12
感谢您的回答。我知道我怎么能找到朋友的朋友,但那是我想要的超集。我只想要朋友的朋友也是用户的朋友,这也是可选的。如果你认为每个人都有100个朋友,我想要这个用户,他的100个朋友,以及这101个人如何彼此交朋友 – nambrot 2013-03-01 12:43:36