Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j Node4j获取子图中的多级关系节点_Neo4j_Cypher_Graph Databases - Fatal编程技术网

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