1
我想匹配图中的特定路径。这些好的路径不应该包含某些子路径,例如避免某些节点。 例如,给定的图表Neo4j密码查询:排除MATCH中的子路径
a->b->c->d
a->avoid1->b
c->avoid2->d
NB:可能有许多更多的节点在我所指定的边缘之间,例如a->t0->t1->b
或a->avoid1->t2->b
。现在
我想从一个得到所有路径d不包含某些子路径,准确地说,这些子路径从a
在avoid1
要b
和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)
和我目前的尝试(由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
然而,这给了我“(没有行)“。
我添加的命令创建我的图。我无法得到您的建议工作。你可以重新检查吗? – stackoverflowwww
这不是关于从与avoid1具有关系的路径中排除节点,而是排除a和avoid1之间的关系成为路径的一部分。 – stackoverflowwww