2015-11-09 96 views
1

我想匹配圖中的特定路徑。這些好的路徑不應該包含某些子路徑,例如避免某些節點。 例如,給定的圖表Neo4j密碼查詢:排除MATCH中的子路徑

a->b->c->d 
a->avoid1->b 
c->avoid2->d 

NB:可能有許多更多的節點在我所指定的邊緣之間,例如a->t0->t1->ba->avoid1->t2->b。現在

我想從一個得到所有路徑d不包含某些子路徑,準確地說,這些子路徑從aavoid1bc超過avoid2d

我現在的(不足)的做法是相匹配的完整路徑我正在尋​​找,然後指定節點我想避免:

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 

然而,這給了我「(沒有行)「。

回答

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; 
+0

我添加的命令創建我的圖。我無法得到您的建議工作。你可以重新檢查嗎? – stackoverflowwww

+0

這不是關於從與avoid1具有關係的路徑中排除節點,而是排除a和avoid1之間的關係成爲路徑的一部分。 – stackoverflowwww