2

我正在将我的复杂用户数据库移动到 Neo4j,用户可以在其中加入多个团队之一,彼此成为朋友等等。在 RDBMS 中执行此操作既痛苦又缓慢,但使用 Neo4j 非常简单且令人兴奋。:)

我希望有一种方法可以查询

  • 距离一跳的关系和
  • 另一种关系是 2 跳远

从同一个查询。

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

原因是作为朋友的用户彼此相距一条边,但由团队链接的用户是通过该团队节点链接的,因此他们相距两条边。此查询执行 IS_FRIEND*2 和 ON_TEAM*2,获取队友(是的)和朋友的朋友(嘘)。

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

4

2 回答 2

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

感谢您将样本数据库放在一起,Werner。

于 2013-01-02T19:15:45.327 回答
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
于 2013-01-02T12:02:00.723 回答