我有一个基于属性获取节点的查询
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到结果集之外的节点的关系,在我的情况下(几十万个关系)可能会产生非常大的无用结果集或性能问题)
有没有办法实现这一目标?
我想有多种方法可以做到这一点。一种方法是查找给定类型的所有节点并从中构建一个集合 ( 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)
亚历克斯,
解决这个问题的另一种方法是这个查询:
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)
这允许存在不存在此类关系的情况。
恩典与平安,
吉姆
归档时间: |
|
查看次数: |
10078 次 |
最近记录: |