具有可变关系路径长度的Neo4j cypher查询

时间:2013-01-02 04:04:38

标签: neo4j cypher

我正在移动我的复杂用户数据库,其中用户可以在众多团队中的一个上,彼此成为朋友,更多是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是否有一种简洁的方法可以在一个查询中获得不同长度的关系?

2 个答案:

答案 0 :(得分: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,Werner放在一起。

答案 1 :(得分: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