2017-03-29 19 views
0

排除一個查詢的結果說我有兩個查詢在Neo4j的如何從另一個

MATCH (a:User)-[:Likes]->(b:Object) WHERE <condition on b> RETURN a

MATCH (a:User)-[:HasVisited]->(c:Location) WHERE <condition on c> RETURN a

我想這兩個結合起來。這樣,我有從QUERY2是DONOT適合QUERY1

到目前爲止,我已經嘗試結果如下

MATCH (a:User)-[:Likes]->(b:Object) MATCH (a:User)-[:HasVisited]->(c:Location) WHERE <condition on c> AND NOT <condition on b> RETURN a

但這種做法並不排除我想排除所有結果。

MATCH (a:User)-[:Likes]->(b:Object) WHERE <condition on b> WITH collect(DISTINCT a) as exc MATCH (a:User)-[:HasVisited]->(c:Location) WHERE <condition on c> AND NOT a IN exc RETURN a

這給正確的結果,但得到低效一次QUERY1和QUERY2開始變得更加複雜

我也曾嘗試

MATCH (a:User)-[:Likes]->(b:Object) WHERE <condition on b> WITH collect(DISTINCT a) as exc MATCH (a:User) WHERE NOT a IN exc WITH a MATCH MATCH (a:User)-[:HasVisited]->(c:Location) WHERE <condition on c> RETURN a

我曾希望減少節點數目一個可以與前期匹配會提高性能,但這種方法似乎沒有更好的工作。

是否有標準/更好的方法來排除匹配另一個查詢的結果?

+0

我不知道一個更好的辦法,因爲沒有'MINUS'運營商在Cypher。使用'collect'和'IN'似乎是做到這一點的方法。 –

回答

0

第一個例子的問題在於,它仍然可以匹配(a:User)-[:Likes]->(b:Object)的某個關係,其中'b'不符合條件,而您希望在結果與選定的' b」。

要做到這一點,你可以使用一個OPTIONAL MATCH條款:

MATCH (a:User)-[:HasVisited]->(c:Location) 
WHERE <condition on c> 
OPTIONAL MATCH (a)-[:Likes]->(b:Object) 
WHERE <condition on b> 
WITH a, b, c 
WHERE b IS NULL 
RETURN a 
0

您可以嘗試這樣的:

MATCH (U1:User)-[:HasVisited]->(L:Location) 
    WHERE <condition on c> 
WITH distinct U1 
OPTIONAL MATCH (U2:User)-[:Likes]->(O:Object) 
    WHERE U2 = U1 AND 
      <condition on b> 
WITH U1, 
    count(U2) as excl 
    WHERE excl = 0 
RETURN U1