Neo4j 选择单有向无环图
我是neo4j的新手,我试图从一个图中提取一个单一的、有向无环的子图,以便能够迭代生成的图(或节点和路径的集合),并跟踪每个节点所在的层(其中,Neo4j 选择单有向无环图,neo4j,cypher,Neo4j,Cypher,我是neo4j的新手,我试图从一个图中提取一个单一的、有向无环的子图,以便能够迭代生成的图(或节点和路径的集合),并跟踪每个节点所在的层(其中,层基于最近的根节点的跃点数)。这在cypher中可能吗?我正在使用REST api 我拥有的示例数据结构类似于以下子图,其中A和H将是“根”节点: A -+ B -+ D | + H -+ C -+ E | + F S* B和C将分别是第1层和D,E,F将是第2层。A和H有一个:子图与
层
基于最近的根节点的跃点数)。这在cypher中可能吗?我正在使用REST api
我拥有的示例数据结构类似于以下子图,其中A
和H
将是“根”节点:
A -+ B -+ D
|
+
H -+ C -+ E
|
+
F
S*
B
和C
将分别是第1层和D
,E
,F
将是第2层。A
和H
有一个:子图
与S*
的关系,我想要的子图中的所有节点:子图的成员与S*/code>的关系
下面的查询将返回我想要的子图(逐段),但是,我不确定如何对路径中的节点进行排序
MATCH p = (n)-[r:ARROW_TO*]-(t)-[:SUBGRAPH_ENTER]-(s)
where
(n)-[:MEMBER_OF_SUBGRAPH]->(s)
RETURN p
有人能提供建议吗?[编辑]
如果使用以下两个查询创建示例非循环图:
CREATE (s:Subgraph),
(a:Foo {id:'A'}), (b:Foo {id:'B'}), (c:Foo {id:'C'}), (d:Foo {id:'D'}), (e:Foo {id:'E'}), (f:Foo {id:'F'}), (h:Foo {id:'H'}),
(a)-[:ARROW_TO]->(b)-[:ARROW_TO]->(d),
(h)-[:ARROW_TO]->(c)-[:ARROW_TO]->(e),
(b)-[:ARROW_TO]->(c)-[:ARROW_TO]->(f),
(a)<-[:SUBGRAPH_ENTER]-(s),
(h)<-[:SUBGRAPH_ENTER]-(s);
MATCH (f:Foo), (s:Subgraph)
CREATE (f)-[:MEMBER_OF_SUBGRAPH]->(s);
WHERE
子句从其他子图中筛选出部分路径或具有节点的路径。
第一个WITH
子句收集从根节点开始的每个路径中的节点。
第二个WITH
子句为第一个集合中的每个节点生成节点/距离对集合。
UNWIND
将后一个集合转换为数据行,以便通过MIN
聚合功能进行处理
结果如下:
+------------------------------------------+
| s | node | distance |
+------------------------------------------+
| Node[38]{} | Node[41]{id:"C"} | 1 |
| Node[38]{} | Node[40]{id:"B"} | 1 |
| Node[38]{} | Node[44]{id:"F"} | 2 |
| Node[38]{} | Node[43]{id:"E"} | 2 |
| Node[38]{} | Node[42]{id:"D"} | 2 |
+------------------------------------------+
+-----------------------------------------+
| s | node | distance |
+-----------------------------------------+
| Node[6]{} | Node[7]{id:"A"} | 0 |
| Node[6]{} | Node[13]{id:"H"} | 0 |
| Node[6]{} | Node[8]{id:"B"} | 1 |
| Node[6]{} | Node[9]{id:"C"} | 1 |
| Node[6]{} | Node[10]{id:"D"} | 2 |
| Node[6]{} | Node[12]{id:"F"} | 2 |
| Node[6]{} | Node[11]{id:"E"} | 2 |
+-----------------------------------------+
包括根节点
如果要在输出中包括根节点,此查询将执行以下操作:
MATCH p=(s)-[:SUBGRAPH_ENTER]->(root)-[:ARROW_TO*]->(leaf)
WHERE (NOT (leaf)-[:ARROW_TO]->()) AND ALL (n IN NODES(p)[1..] WHERE (n)-[:MEMBER_OF_SUBGRAPH]->(s))
WITH s, NODES(p)[1..] AS nodes
WITH s, REDUCE(s =[], i IN RANGE(0, SIZE(nodes)-1)| s + { node: nodes[i], dist: i }) AS data
UNWIND data AS datum
RETURN s, datum.node AS node, MIN(datum.dist) AS distance
ORDER BY distance;
结果如下:
+------------------------------------------+
| s | node | distance |
+------------------------------------------+
| Node[38]{} | Node[41]{id:"C"} | 1 |
| Node[38]{} | Node[40]{id:"B"} | 1 |
| Node[38]{} | Node[44]{id:"F"} | 2 |
| Node[38]{} | Node[43]{id:"E"} | 2 |
| Node[38]{} | Node[42]{id:"D"} | 2 |
+------------------------------------------+
+-----------------------------------------+
| s | node | distance |
+-----------------------------------------+
| Node[6]{} | Node[7]{id:"A"} | 0 |
| Node[6]{} | Node[13]{id:"H"} | 0 |
| Node[6]{} | Node[8]{id:"B"} | 1 |
| Node[6]{} | Node[9]{id:"C"} | 1 |
| Node[6]{} | Node[10]{id:"D"} | 2 |
| Node[6]{} | Node[12]{id:"F"} | 2 |
| Node[6]{} | Node[11]{id:"E"} | 2 |
+-----------------------------------------+
嘿,很好!我怎样才能在结果中包含A
和H
并省略S*
(另外,如果你能用和展开
子句解释中的操作,或者链接到某个地方:)如果你从结果中去掉S*
节点,然后,多个子图的结果将混杂在一起。但是,如果您真的想这样做,只需从“返回行”中删除s、
。