NEO4J Cypher查询具有可变关系路径长度的查询



我正在移动我的复杂用户数据库,用户可以在其中一个团队中,彼此成为朋友,而更多地成为neo4j。在RDBMS中这样做是痛苦且缓慢的,但是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)。

在一个查询中,有没有一种简洁的方法可以在单个查询中获得不同的长度关系?

我将其重写以返回集合:

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放在一起。

我在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

最新更新