Neo4j cypher查询:从MATCH中排除子路径

时间:2015-11-09 14:58:11

标签: neo4j cypher

我想匹配图表中的某些路径。这些良好的路径不应包含某些子路径,例如避开某些节点。 例如,给出图表

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

注意:我指定的边缘之间可能有更多节点,例如a->t0->t1->ba->avoid1->t2->b

现在我想获得从a到d的所有路径,其中不包含某些子路径,确切地说,那些子路径从a越过avoid1b和{ {1}}超过cavoid2

我当前(不充分)的方法是匹配我正在寻找的整个路径,然后指定我想避免的节点:

d

这对我来说不合适,因为我实际上需要“过滤掉”子路径而不是节点。

我需要这样的东西:

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)

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

1 个答案:

答案 0 :(得分: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;