Neo4j密码查询:从匹配中排除子路径

Neo4j密码查询:从匹配中排除子路径,neo4j,cypher,Neo4j,Cypher,我想匹配图形中的某些路径。这些良好的路径不应包含某些子路径,例如避免某些节点。 例如,给定图形 a->b->c->d a->avoid1->b c->avoid2->d 注意:在我指定的边之间可能有更多的节点,例如a->t0->t1->b或a->avoid1->t2->b 现在我想得到从a到d的所有路径,它们不包含某些子路径,准确地说,这些子路径从aoveravoid1到b以及从coveravoid2到d 我当前(不足)的方法是匹配我要查找的整个路径,

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

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

现在我想得到从a到d的所有路径,它们不包含某些子路径,准确地说,这些子路径从
a
over
avoid1
b
以及从
c
over
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)
我目前的尝试(如dave的回答所示):


但是,这给了我“(无行)”。

此查询应允许您筛选路径:

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;

我添加了创建图形的命令。我不能让你的建议生效。你能重新检查一下吗?这不是要从路径中排除与avoid1有关系的节点,而是要排除a和avoid1之间的关系,使其不成为路径的一部分。您好@gogo_gorila,您找到解决方案了吗?我有一个类似的问题,我想看看你的approach@bmalbusca不,很久没有研究这个话题了。好的,我找到了解决这类问题的方法。要做的第一件事是排除以源节点变量结尾的可能路径,并排除使用end节点变量的前向路径。然后,使用apoc.path.combine()组合子路径
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;