2013-03-01 67 views
0

我相信我应该是一个非常简单,但由于某种原因,我没有前进。我有经典的社交网络设置,用户可以成为彼此的朋友。我知道要想象一个用户的网络D3.jsNeo4j Cypher:获得共同的朋友网络

对于这一点,其明显的如何让朋友现在

user -[:friend]- friend 

,我也想显示用户的好友之间的联系,使之很好地集合在一个力指向图中。但是,这是我目前的问题,因为我想知道“朋友”组是如何相互连接的。我第一次想到

with friend 
match friend -[connection:friend]- friend 

会工作,但显然不会。我似乎忽略了一件非常明显的事情,但我不确定是什么。

编辑:小鬼是值得欢迎的也可能是更高性能如果更多的遍历-Y /明确

+0

不与朋友做赛后后者在声明'...'而是把它直接进入比赛阶段,比如'MATCH用户 - [:朋友] -firend- [连接:朋友] -friend2'。这对你有用吗? – ulkas 2013-03-01 08:50:12

+0

感谢您的回答。我知道我怎么能找到朋友的朋友,但那是我想要的超集。我只想要朋友的朋友也是用户的朋友,这也是可选的。如果你认为每个人都有100个朋友,我想要这个用户,他的100个朋友,以及这101个人如何彼此交朋友 – nambrot 2013-03-01 12:43:36

回答

0

或许这将激发你使用小鬼的解决方案。我将你的问题改编成标准的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]不再在结果中。从这里你可以很容易地构建可视化输出。