我希望在子图中获取关系中的节点,例如:
A-BELONGS->B
B-BELONGS->C
C-REQUIRES->B
C-REQUIRES->H
B-REQUIRES->P
因此,我想从A开始,递归地得到所有具有归属关系的节点,即A,B,C,然后得到与这些节点相关但不属于属于关系子图的节点,即H和P,但不是B。但我只想返回需求关系中的那些节点。
我编写了这样的查询:
MATCH (node:Node {name: 'A'})-[:BELONGS*]->(dep)
USING collect(node) + collect(dep) as nodes
WITH (dep)-[:REQUIRES]->(req)
return disinct req
在这里,我只希望得到P和H,但这不是我得到的。这个查询有什么问题?
发布于 2017-04-30 19:06:40
根据您的描述,您的数据集如下所示:
我的解决方案,一步一步地根据您的问题描述:
所以我想从A开始,递归地得到所有有一个归属关系的节点,即A,B,C,
MATCH (a:Node {name:'A'})-[:BELONGS*]->(n)
WITH a + collect(n) as nodes
UNWIND nodes as unwinded
然后得到需要的节点与这些节点之间的关系,而不是在属于关系子图中的节点,即H和P,而不是B。但我只想返回需要关系中的那些节点。
MATCH(unwinded)-[:REQUIRES]->(m)
WHERE NOT m IN nodes
RETURN m
生成的Cypher查询如下:
MATCH (a:Node {name:'A'})-[:BELONGS*]->(n)
WITH a + collect(n) as nodes
UNWIND nodes as unwinded
MATCH(unwinded)-[:REQUIRES]->(m)
WHERE NOT m IN nodes
RETURN m
使用配置文件运行此查询显示22分贝点击量。分析由赛博萨姆描述的查询显示27分贝点击量。在我看来,从第一眼和非常肤浅的角度来看,这个查询的代价要低一些。
发布于 2017-04-29 00:00:49
查询中有许多语法错误。即使我们修复了这些问题,基本的逻辑也是有缺陷的,因为(dep)-[:REQUIRES]->(req)
模式甚至没有使用任何明确定义的标识符(node
、dep
或nodes
),而且它也不使用可变长度的关系模式。
这应该是可行的:
MATCH p=(node:Node {name: 'A'})-[:BELONGS*]->(dep)
WITH NODES(p) AS nodes
UNWIND nodes AS n
WITH COLLECT(DISTINCT n) AS ns
UNWIND ns AS nd
MATCH (nd)-[:REQUIRES*]->(req)
WHERE NOT req IN ns
RETURN DISTINCT req;
该查询首先匹配所有相关的BELONGS
路径(任意深度),删除重复的节点,并将节点收集到单个ns
集合中。然后,它使用这些节点中的每一个来获取它们的REQUIRES
路径上的节点(到任何深度),而这些路径并不在ns
中。最后,它返回不同的结果节点。
https://stackoverflow.com/questions/43689617
复制相似问题