Neo4j Node4j获取子图中的多级关系节点
我想得到子图中关系中的节点 例如:Neo4j Node4j获取子图中的多级关系节点,neo4j,cypher,graph-databases,Neo4j,Cypher,Graph Databases,我想得到子图中关系中的节点 例如: A-BELONGS->B B-BELONGS->C C-REQUIRES->B C-REQUIRES->H B-REQUIRES->P 所以我想从A开始,递归地获取所有具有归属关系的节点,即A、B、C,然后获取与这些节点相关但不在归属关系子图中的节点,即H和p,但不在B。但我只想返回REQUIRES关系中的节点 我编写了如下查询: MATCH (node:Node {name: 'A'})-[:BELONGS*]->(de
A-BELONGS->B
B-BELONGS->C
C-REQUIRES->B
C-REQUIRES->H
B-REQUIRES->P
所以我想从A开始,递归地获取所有具有归属关系的节点,即A、B、C,然后获取与这些节点相关但不在归属关系子图中的节点,即H和p,但不在B。但我只想返回REQUIRES关系中的节点
我编写了如下查询:
MATCH (node:Node {name: 'A'})-[:BELONGS*]->(dep)
USING collect(node) + collect(dep) as nodes
WITH (dep)-[:REQUIRES]->(req)
return disinct req
这里我只希望得到p和H,但这不是我得到的。此查询有什么问题?您的查询中有许多语法错误。即使我们解决了这些问题,基本逻辑也是有缺陷的,因为
(dep)-[:REQUIRES]->(req)
模式甚至没有使用任何明确定义的标识符(node
、dep
或节点
),而且它也没有使用可变长度的关系模式
这应该起作用:
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;
此查询首先匹配所有相关的
所属的路径(任意深度),删除重复节点,并将节点收集到单个ns
集合中。然后,它使用这些节点中的每一个来获取它们的REQUIRES
路径(到任何深度)上的节点,这些路径不在ns
中。最后,它返回不同的结果节点。根据您的描述,数据集如下所示:
MATCH (node:Node {name: 'A'})-[:BELONGS*]->(dep)
USING collect(node) + collect(dep) as nodes
WITH (dep)-[:REQUIRES]->(req)
return disinct req
我的解决方案,根据您的问题描述逐步实施:
所以我想从A开始,递归地得到所有具有A的节点
归属关系,即A、B、C、
然后获取与这些节点相关的节点,但是
不在隶属关系子图中,即H和P,但不是B,而是i
希望只返回REQUIRES关系中的那些节点
生成的密码查询是:
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 db的命中率。对cybersam描述的查询进行分析显示27 db命中率。乍一看,从表面上看,在我看来,这个查询的成本要低一点。谢谢你,效果很好。我已经开始研究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