首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Node4j获取子图中的多级关系节点

Node4j获取子图中的多级关系节点
EN

Stack Overflow用户
提问于 2017-04-28 22:17:06
回答 2查看 301关注 0票数 1

我希望在子图中获取关系中的节点,例如:

代码语言:javascript
运行
复制
A-BELONGS->B
B-BELONGS->C
C-REQUIRES->B
C-REQUIRES->H
B-REQUIRES->P

因此,我想从A开始,递归地得到所有具有归属关系的节点,即A,B,C,然后得到与这些节点相关但不属于属于关系子图的节点,即H和P,但不是B。但我只想返回需求关系中的那些节点。

我编写了这样的查询:

代码语言:javascript
运行
复制
MATCH (node:Node {name: 'A'})-[:BELONGS*]->(dep)
USING collect(node) + collect(dep) as nodes
WITH (dep)-[:REQUIRES]->(req)
return disinct req

在这里,我只希望得到P和H,但这不是我得到的。这个查询有什么问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-30 19:06:40

根据您的描述,您的数据集如下所示:

我的解决方案,一步一步地根据您的问题描述:

所以我想从A开始,递归地得到所有有一个归属关系的节点,即A,B,C,

代码语言:javascript
运行
复制
MATCH (a:Node {name:'A'})-[:BELONGS*]->(n)
WITH a + collect(n) as nodes
UNWIND nodes as unwinded

然后得到需要的节点与这些节点之间的关系,而不是在属于关系子图中的节点,即H和P,而不是B。但我只想返回需要关系中的那些节点。

代码语言:javascript
运行
复制
MATCH(unwinded)-[:REQUIRES]->(m)
WHERE NOT m IN nodes
RETURN m

生成的Cypher查询如下:

代码语言:javascript
运行
复制
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分贝点击量。在我看来,从第一眼和非常肤浅的角度来看,这个查询的代价要低一些。

票数 2
EN

Stack Overflow用户

发布于 2017-04-29 00:00:49

查询中有许多语法错误。即使我们修复了这些问题,基本的逻辑也是有缺陷的,因为(dep)-[:REQUIRES]->(req)模式甚至没有使用任何明确定义的标识符(nodedepnodes),而且它也不使用可变长度的关系模式。

这应该是可行的:

代码语言:javascript
运行
复制
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中。最后,它返回不同的结果节点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43689617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档