2015-11-09 67 views
1

我想匹配图中的特定路径。这些好的路径不应该包含某些子路径,例如避免某些节点。 例如,给定的图表Neo4j密码查询:排除MATCH中的子路径

a->b->c->d 
a->avoid1->b 
c->avoid2->d 

NB:可能有许多更多的节点在我所指定的边缘之间,例如a->t0->t1->ba->avoid1->t2->b。现在

我想从一个得到所有路径d不包含某些子路径,准确地说,这些子路径从aavoid1bc超过avoid2d

我现在的(不足)的做法是相匹配的完整路径我正在寻​​找,然后指定节点我想避免:

MATCH p=(a)-[:CF*]->(b)-[:CF*]->(c)-[:CF*]->(d) 
WHERE NOT (avoid1 IN nodes(p)) 

这不是为我工作,因为我真的需要“过滤“子路径而不是节点。

我需要的是这样的:

MATCH p=(a)-[:CF*]->(b)-[:CF*]->(c)-[:CF*]->(d) 
WHERE NOT ((a)-[:CF*]->(avoid1)->[:CF*]->(b) IN p) AND NOT ((c)-[:CF*]->(avoid2)->[:CF*]->(d)) 

这是不行的,我知道,但它可能有助于解释什么,我需要:一种方式基于含有某些子路径的事实来过滤掉路径。

编辑:

下面是命令:

MERGE (a:MYTYPE { label:'a' }) 
MERGE (b:MYTYPE { label:'b' }) 
MERGE (c:MYTYPE { label:'c' }) 
MERGE (d:MYTYPE { label:'d' }) 
MERGE (avoid1:MYTYPE { label:'avoid1' }) 
MERGE (avoid2:MYTYPE { label:'avoid2' }) 

CREATE (a)-[:CF]->(b) 
CREATE (b)-[:CF]->(c) 
CREATE (c)-[:CF]->(d) 

CREATE (a)-[:CF]->(avoid1) 
CREATE (avoid1)-[:CF]->(b) 
CREATE (c)-[:CF]->(avoid2) 
CREATE (avoid2)-[:CF]->(d) 

和我目前的尝试(由Dave的答案的建议):

MATCH (a:MYTYPE { label:'a' }) 
MATCH (b:MYTYPE { label:'b' }) 
MATCH (c:MYTYPE { label:'c' }) 
MATCH (d:MYTYPE { label:'d' }) 
MATCH (avoid1:MYTYPE { label:'avoid1' }) 
MATCH (avoid2:MYTYPE { label:'avoid2' }) 

MATCH p=(a)-[:CF*]->(b)-[:CF*]->(c)-[:CF*]->(d) 
WHERE NOT ((a)-[:CF*]->(avoid1 {label:'avoid1'})-[:CF*]->(b)) 

RETURN p 

然而,这给了我“(没有行)“。

回答

1

该查询应该让你的路径过滤:

MATCH p=(a)-[:CF*]->(b)-[:CF*]->(c)-[:CF*]->(d) 
WHERE NOT ((a)-[:CF*]->()-[:CF*]->(b)) 
AND NOT ((c)-[:CF*]->()-[:CF*]->(d)) 
return p;` 

你也可以指定节点要筛选上的标签/属性:

MATCH p=(a)-[:CF*]->(b)-[:CF*]->(c)-[:CF*]->(d) 
WHERE NOT ((a)-[:CF*]->(:Person {name:'Dave'})-[:CF*]->(b)) AND NOT ((c)-[:CF*]->()-[:CF*]->(d)) 
return p; 
+0

我添加的命令创建我的图。我无法得到您的建议工作。你可以重新检查吗? – stackoverflowwww

+0

这不是关于从与avoid1具有关系的路径中排除节点,而是排除a和avoid1之间的关系成为路径的一部分。 – stackoverflowwww