2013-01-02 60 views
2

我运动我复杂的用户数据库,用户可以在众多的球队之一,是朋友相互多以Neo4j的CYPHER查询。在RDBMS中这样做是痛苦和缓慢的,但是使用Neo4j很简单并且很炫。 :)Neo4j的可变关系路径长度

我希望有一种方式,

  • 查询的关系是1周跳,距离
  • 相互之间的关系也就是2个跳之外

从相同的查询。

START n=node:myIndex(user='345') 
MATCH n-[:IS_FRIEND|ON_TEAM*2]-m 
RETURN DISTINCT m; 

的原因是,这是朋友的用户彼此一个优势,但用户可以通过团队链接是通过团队的节点联系,所以它们是两个边走。这个查询是IS_FRIEND * 2和ON_TEAM * 2,它让队友(是)和朋友的朋友(boo)。

是否有Cypher支架简洁的方式来获得在单个查询两种不同长度的关系?

+0

约瑟夫,你可以做console.neo4j.org一个小例子任何机会呢? –

回答

2

我重写它返回一个集合:

start person=node(1) 
match person-[:IS_FRIEND]-friend 
with person, collect(distinct friend) as friends 
match person-[:ON_TEAM*2]-teammate 
with person, friends, collect(distinct teammate) as teammates 
return person, friends + filter(dupcheck in teammates: not(dupcheck in friends)) as teammates_and_friends 

http://console.neo4j.org/r/oo4dvx

感谢您推荐一起样品db,维尔纳。

+0

这就是票。 3ms的运行时间,与其他节点(*)选择器的sol'n相比。谢谢您的帮助。 :) –

1

我在http://console.neo4j.org/?id=sqyz7i

创建了一个小的测试数据库中,我还创建了一个查询,这将是你所描述的工作:

START n=node(1) 
MATCH n-[:IS_FRIEND]-m 
WITH collect(distinct id(m)) as a, n 
MATCH n-[:ON_TEAM*2]-m 
WITH collect(distinct id(m)) as b, a 
START n=node(*) 
WHERE id(n) in a + b 
RETURN n 
+0

电话良好@ werner-vesteras! –

+0

@ werner-verteras'节点(*)'是否仅限于集合a和b?分别为IS_FRIEND部分和ON_TEAM * 2部分运行查询的速度始终比组合查询快20倍。只需运行两个查询并将它们结合到Java中似乎更快。谢谢。 –

+0

@JosephLust我不知道,但我的猜测是,'节点(*)'意味着整个图形。但是,这是我能做的最好的一个查询。我相信这可以做得更聪明,但密码对我来说还是很新的。 –

相关问题