查询到return个子图及所有内部关系
Query to return subgraph and all internal relationships
给定下图:
可通过以下 Cypher 脚本创建:
CREATE
(n1:Token {content: "lonely"}),
(n2:Token {content: "island"}),
(n1)-[:PRECEDES]->(n2);
CREATE
(n1:Token {content: "the"}),
(n2:Token {content: "quick"}),
(n3:Token {content: "brown"}),
(n4:Token {content: "fox"}),
(n5:Token {content: "bear"}),
(n1)-[:PRECEDES]->(n2),
(n2)-[:PRECEDES]->(n3),
(n3)-[:PRECEDES]->(n4),
(n3)-[:PRECEDES]->(n5);
我想要一个查询,它将 return 从给定根开始的路径中的节点,如下所示
PRECEDES 关系向后。查询应该 also return all
给定节点的传入关系,以便我可以构建子图
稍后在内存中。但是,传入关系列表永远不应该指向
在 returned 根之外。
例如,如果我查询根 lonely
,我想要结果:
+-----------------------------------------------------------------------+
| (:Token {content: "lonely"}) | [] |
| (:Token {content: "island"}) | [[:PRECEDES]] |
+-----------------------------------------------------------------------+
如果我查询根 the
,我想要结果:
+-----------------------------------------------------------------------+
| (:Token {content: "the"}) | [] |
| (:Token {content: "quick"}) | [[:PRECEDES]] |
| (:Token {content: "brown"}) | [[:PRECEDES]] |
| (:Token {content: "fox"}) | [[:PRECEDES]] |
| (:Token {content: "bear"}) | [[:PRECEDES]] |
+-----------------------------------------------------------------------+
如果我查询根brown
,我想要下面的结果,注意
brown
本身的传入关系已被删除,因为它会
指向子图之外。
+-----------------------------------------------------------------------+
| (:Token {content: "brown"}) | [] |
| (:Token {content: "fox"}) | [[:PRECEDES]] |
| (:Token {content: "bear"}) | [[:PRECEDES]] |
+-----------------------------------------------------------------------+
结果中应始终包含根节点和叶节点。
这是我目前的尝试:
MATCH (a:Token {content: {root}})-[:PRECEDES*]->(t:Token)
WITH COLLECT(a) + COLLECT(DISTINCT t) AS nodes_
UNWIND nodes_ AS n
OPTIONAL MATCH p = (n)-[r]-()
WITH n AS n2, COLLECT(DISTINCT RELATIONSHIPS(p)) AS nestedrel
RETURN n2, REDUCE(output = [], rel in nestedrel | output + rel) AS rels
这有点接近,但有几个问题:使用 COLLECT(a)
人为地包含根是一种 hacky,它留下了关系
远离关系结果中的根,如果您尝试使用
叶节点作为根节点,它根本不会 return 任何节点。 (REDUCE
部分是
只是将关系列表展平一级。)
[仅供参考,我需要在内存中重建这个树结构作为
NetworkX 多有向图。]
由于稍后要在内存中重建子图,可以直接使用APOC procedure apoc.convert.toTree
和return 树结构,不需要转换。因此,您可以 运行 查询,例如:
match p = (:Token {content: "the"})-[:PRECEDES*]->(end:Token)
where not (end)-[:PRECEDES]->()
call apoc.convert.toTree([p]) yield value
return value
给定下图:
可通过以下 Cypher 脚本创建:
CREATE
(n1:Token {content: "lonely"}),
(n2:Token {content: "island"}),
(n1)-[:PRECEDES]->(n2);
CREATE
(n1:Token {content: "the"}),
(n2:Token {content: "quick"}),
(n3:Token {content: "brown"}),
(n4:Token {content: "fox"}),
(n5:Token {content: "bear"}),
(n1)-[:PRECEDES]->(n2),
(n2)-[:PRECEDES]->(n3),
(n3)-[:PRECEDES]->(n4),
(n3)-[:PRECEDES]->(n5);
我想要一个查询,它将 return 从给定根开始的路径中的节点,如下所示 PRECEDES 关系向后。查询应该 also return all 给定节点的传入关系,以便我可以构建子图 稍后在内存中。但是,传入关系列表永远不应该指向 在 returned 根之外。
例如,如果我查询根 lonely
,我想要结果:
+-----------------------------------------------------------------------+
| (:Token {content: "lonely"}) | [] |
| (:Token {content: "island"}) | [[:PRECEDES]] |
+-----------------------------------------------------------------------+
如果我查询根 the
,我想要结果:
+-----------------------------------------------------------------------+
| (:Token {content: "the"}) | [] |
| (:Token {content: "quick"}) | [[:PRECEDES]] |
| (:Token {content: "brown"}) | [[:PRECEDES]] |
| (:Token {content: "fox"}) | [[:PRECEDES]] |
| (:Token {content: "bear"}) | [[:PRECEDES]] |
+-----------------------------------------------------------------------+
如果我查询根brown
,我想要下面的结果,注意
brown
本身的传入关系已被删除,因为它会
指向子图之外。
+-----------------------------------------------------------------------+
| (:Token {content: "brown"}) | [] |
| (:Token {content: "fox"}) | [[:PRECEDES]] |
| (:Token {content: "bear"}) | [[:PRECEDES]] |
+-----------------------------------------------------------------------+
结果中应始终包含根节点和叶节点。
这是我目前的尝试:
MATCH (a:Token {content: {root}})-[:PRECEDES*]->(t:Token)
WITH COLLECT(a) + COLLECT(DISTINCT t) AS nodes_
UNWIND nodes_ AS n
OPTIONAL MATCH p = (n)-[r]-()
WITH n AS n2, COLLECT(DISTINCT RELATIONSHIPS(p)) AS nestedrel
RETURN n2, REDUCE(output = [], rel in nestedrel | output + rel) AS rels
这有点接近,但有几个问题:使用 COLLECT(a)
人为地包含根是一种 hacky,它留下了关系
远离关系结果中的根,如果您尝试使用
叶节点作为根节点,它根本不会 return 任何节点。 (REDUCE
部分是
只是将关系列表展平一级。)
[仅供参考,我需要在内存中重建这个树结构作为 NetworkX 多有向图。]
由于稍后要在内存中重建子图,可以直接使用APOC procedure apoc.convert.toTree
和return 树结构,不需要转换。因此,您可以 运行 查询,例如:
match p = (:Token {content: "the"})-[:PRECEDES*]->(end:Token)
where not (end)-[:PRECEDES]->()
call apoc.convert.toTree([p]) yield value
return value