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