2016-05-09 33 views
0

我有一個簡單的社交信息流的節點,其中幾個節點和關係如下所示:Neo4j的混合使用和不使用擴展關係

row 1: (a) -> (stream) -> (d) 
row 2: (a) -> (stream) -> (d) -> (source) 

基本上,我想拉都行,但把一些限制源的類型,例如我目前使用的是:

MATCH (a)-[]->(stream)-[]->(d) 
OPTIONAL MATCH (d)-[]->(source) 
    WHERE source.x = 3 
RETURN stream, d, source 

這很好。幾乎。當source.x = 3時,我得到兩行。這是完美的。但是,當source.x!= 3時,我希望查詢忽略第二行,但由於可選匹配,行仍然出現。

When source.x = 3 
row 1. stream, d, null 
row 2. stream, d, source 

When source.x != 3 
row 1. stream, d, null 
row 2. stream, d, null 

當source.x!= 3時,我希望查詢忽略第二行。因爲它包含(源)節點,但不包含我們想要的節點。輸出應該是這樣的:

row 1. stream, d, null 

基本上類似,如果(源)不存在秀行..如果它確實存在,顯示行只有source.x = 3

編輯:由於推薦在評論中,我附上了一個簡化的例子。 Simplified example

+0

這是很難按照你的問題。請提供一些實際數據和結果。 – cybersam

+0

@cybersam添加了一個簡化示例 – pewpewlasers

回答

1

可以通過管道與WITH結果和WHERE子句過濾返回他們面前:

MATCH (me:User {name:'me'})-[:LIKES]->(transport) 
OPTIONAL MATCH (transport)-[:HAS_DRIVER]->(driver:Driver {name:'Anne'}) 
WITH me, transport, driver 
WHERE (NOT (transport)-[:HAS_DRIVER]->()) OR (NOT driver IS NULL) 
RETURN me, transport, driver