2017-08-28 90 views
2

我有一个问题,我一直在试图从我的Neo4j数据库中出现的某种情况中获取信息。这是节点配置。Cypher匹配不同深度的路径

Node Configuration

我需要把所有连接到a和所有传入连接,我需要找到有传入连接节点和穿出都在那里传出节点的节点。

,所以我期望abcdlfe。非g,h,i,jk

什么我试过我没有得到一个查询中的完整集。我得到或多或少。

MATCH (n)-[r]-(m) WHERE n.name="a" 
RETURN n,m,r 

只给出abcfl

MATCH (n)-[r]-(m)-[s]->(x) 
WHERE n.name="a" 
RETURN n,m,r,s,x 

,然后我失去bl

所以我一定在做错事。有没有一个查询可以获得我需要的数据?

回答

3

考虑该初始数据集(在打印屏幕中所示的数据模型):

CREATE (a:Node {name : 'a'}) 
CREATE (b:Node {name : 'b'}) 
CREATE (c:Node {name : 'c'}) 
CREATE (d:Node {name : 'd'}) 
CREATE (e:Node {name : 'e'}) 
CREATE (f:Node {name : 'f'}) 
CREATE (g:Node {name : 'g'}) 
CREATE (h:Node {name : 'h'}) 
CREATE (i:Node {name : 'i'}) 
CREATE (j:Node {name : 'j'}) 
CREATE (k:Node {name : 'k'}) 
CREATE (l:Node {name : 'l'}) 

CREATE (a)-[:CONNECTED_TO]->(c) 
CREATE (c)-[:CONNECTED_TO]->(d) 
CREATE (a)-[:CONNECTED_TO]->(l) 
CREATE (b)-[:CONNECTED_TO]->(a) 
CREATE (a)-[:CONNECTED_TO]->(f) 
CREATE (f)-[:CONNECTED_TO]->(e) 
CREATE (g)-[:CONNECTED_TO]->(f) 
CREATE (i)-[:CONNECTED_TO]->(g) 
CREATE (i)-[:CONNECTED_TO]->(h) 
CREATE (i)-[:CONNECTED_TO]->(j) 
CREATE (j)-[:CONNECTED_TO]->(k) 

这个查询应该工作:

// Match de start point 'A' 
MATCH (a:Node {name : 'a'}) 
// Match incoming nodes and optionally (0..1) incoming of incoming nodes 
MATCH (a)<-[:CONNECTED_TO]-(b:Node)<-[:CONNECTED_TO*0..1]-(c:Node) 
// collect b and c into rows, pass a to the next context 
WITH a, collect(b) + collect(c) as rows 
// Match outgoing nodes and optionally (0..1) outgoing of outgoing nodes 
MATCH (a)-[:CONNECTED_TO]->(b:Node)-[:CONNECTED_TO*0..1]->(c:Node) 
// collect all into rows 
WITH collect(a) + collect(b) + collect(c) + rows as rows 
// unwind 
UNWIND rows AS unwinded 
// return distinct nodes 
RETURN DISTINCT unwinded 
ORDER BY unwinded.name 

其结果将是:

╒════════════╕ 
│"unwinded" │ 
╞════════════╡ 
│{"name":"a"}│ 
├────────────┤ 
│{"name":"b"}│ 
├────────────┤ 
│{"name":"c"}│ 
├────────────┤ 
│{"name":"d"}│ 
├────────────┤ 
│{"name":"e"}│ 
├────────────┤ 
│{"name":"f"}│ 
├────────────┤ 
│{"name":"l"}│ 
└────────────┘ 

编辑:

重构查询:

MATCH (in2:Node)-[:CONNECTED_TO*0..1]->(in:Node)-[:CONNECTED_TO]->(a:Node {name : 'a'})-[:CONNECTED_TO]->(out:Node)-[:CONNECTED_TO*0..1]->(out2:Node) 
WITH collect(in2) + collect(in) + collect(a) + collect(out) + collect(out2) as rows 
UNWIND rows AS unwinded 
RETURN distinct unwinded 
ORDER BY unwinded.name 

上述查询产生相同的结果,但仅使用一个MATCH整个图案,而不是3个不同MATCH ES。

+0

谢谢你的工作就像一个魅力 – user2622022