Neo4j,获取一组节点之间的所有关系

ale*_*x88 9 neo4j cypher

我有一个基于属性获取节点的查询

MATCH (c { type: 'sometype' })
WITH c LIMIT 100
RETURN c
Run Code Online (Sandbox Code Playgroud)

我想要的只是获取结果集中节点之间的所有关系,在IRC上有人告诉我使用:

MATCH (c { type: 'sometype'])
WITH c LIMIT 100
OPTIONAL MATCH (c)-[r]-()
RETURN c, r
Run Code Online (Sandbox Code Playgroud)

但是这将包括从节点c到结果集之外的节点的关系,在我的情况下(几十万个关系)可能会产生非常大的无用结果集或性能问题)

有没有办法实现这一目标?

Ste*_*ter 5

我想有多种方法可以做到这一点。一种方法是查找给定类型的所有节点并从中构建一个集合 ( cs)。然后再次匹配该组,这次与任何节点的传出关系进行过滤,以确保结束节点位于cs

MATCH (c {type:'sometype'})
WITH collect(c) as cs
MATCH (x {type:'sometype'})-[r]->(y)
WHERE y in cs
RETURN startNode(r).name, endNode(r).name
Run Code Online (Sandbox Code Playgroud)

不知道你的图形模型,但我认为将属性重构type='sometype'为 label可能是个好主意sometype。在这种情况下,查询将如下所示:

MATCH (c:Group1)   
WITH collect(c) as cs
MATCH (x:Group1)-[r]->(y)
WHERE y in cs
RETURN startNode(r).name, endNode(r).name
Run Code Online (Sandbox Code Playgroud)


Jim*_*ard 2

亚历克斯,

解决这个问题的另一种方法是这个查询:

MATCH (c {type : 'sometype'})-[r:*0..1]-(d {type : 'sometype'})
WITH c, collect(r) as rs
RETURN c, rs
Run Code Online (Sandbox Code Playgroud)

这允许存在不存在此类关系的情况。

恩典与平安,

吉姆