【发布时间】:2015-11-09 14:58:10
【问题描述】:
我想匹配图表中的某些路径。这些好的路径不应该包含某些子路径,例如避开某些节点。 例如,给定图形
a->b->c->d
a->avoid1->b
c->avoid2->d
注意:在我指定的边之间可能有更多节点,例如a->t0->t1->b 或 a->avoid1->t2->b。
现在我想获取从 a 到 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)
和我目前的尝试(正如戴夫的回答所建议的那样):
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
然而,这给了我“(没有行)”。
【问题讨论】:
-
您好@gogo_gorila,您对此有解决方案吗?我有类似的问题,我想看看你的方法
-
@bmalbusca 不,很久没有研究这个话题了。
-
好的,我找到了解决此类问题的方法。首先要做的是排除在源节点变量上结束的可能路径,并排除使用结束节点变量的正向路径。然后,使用
apoc.path.combine()组合子路径