我想匹配图表中的某些路径。这些良好的路径不应包含某些子路径,例如避开某些节点。 例如,给出图表
a->b->c->d
a->avoid1->b
c->avoid2->d
注意:我指定的边缘之间可能有更多节点,例如a->t0->t1->b
或a->avoid1->t2->b
。
现在我想获得从a到d的所有路径,其中不包含某些子路径,确切地说,那些子路径从a
越过avoid1
到b
和{ {1}}超过c
到avoid2
。
我当前(不充分)的方法是匹配我正在寻找的整个路径,然后指定我想避免的节点:
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)
然而,这给了我“(没有行)”。
答案 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;