我正在将我复杂的用户数据库转移到Neo4j,用户可以在许多团队中的一个,相互成为朋友,甚至更多。在RDBMS中做到这一点既痛苦又缓慢,但在Neo4j中却很简单。:)
我希望有一种方法可以查询
来自同一个查询。
START n=node:myIndex(user='345')
MATCH n-[:IS_FRIEND|ON_TEAM*2]-m
RETURN DISTINCT m;
原因是作为朋友的用户彼此之间是一条边,但是由团队链接的用户是通过该团队节点链接的,所以他们是两条边之外的。这个查询IS_FRIEND*2和ON_TEAM*2,它得到队友(是的)和朋友的朋友(嘘)。
Cypher中是否有一种简洁的方法可以在单个查询中获取两种不同的长度关系?
我重写了它以返回一个集合:
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。
我在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