2017-03-03 89 views
0

我有一個查詢不起作用。錯誤是:Neo4j控制檯:類型不匹配:預計收集<T>但節點

類型不匹配:預計收藏,但被從節點來FOREACH ..

代碼:

MATCH (user:User {user_role: 'Customer'}) 
WITH user 
OPTIONAL MATCH (user)-[hv:HAS_VAUCHER]->(v:Vaucher {status: 2}) 
WITH user, count(hv) as hv 
WHERE hv = 0 
WITH user 
FOREACH (u IN user | CREATE (v:Vaucher {discount: 5, created_at: 1488531600, start_at: 1488531600, type: 'March', status: 2})<-[:HAS_VAUCHER]-(u)) 

我不知道哪裏出錯。

回答

1

雖然有一些改進,人們可以作出查詢,這裏有一個快速的解決,下降FOREACH因爲你沒有用戶集合中,你已經有了每行一個用戶:

MATCH (user:User {user_role: 'Customer'}) 
WITH user 
OPTIONAL MATCH (user)-[hv:HAS_VAUCHER]->(v:Vaucher {status: 2}) 
WITH user, count(hv) as hv 
WHERE hv = 0 
WITH user 
CREATE (v:Vaucher {discount: 5, created_at: 1488531600, start_at: 1488531600, type: 'March', status: 2})<-[:HAS_VAUCHER]-(user) 
+0

謝謝您的回答詢問,但有一點是不是隻爲一個用戶創建。 –

+1

它不會。 'user'匹配所有user_role'Customer'的用戶,所以無論用戶多少匹配,這就是多少:Vauchers將被創建。創建操作每行執行一次,因此所有匹配的用戶都將獲得他們自己的:Vaucher – InverseFalcon

0

我做了進一步的研究,並做到這一點的方法是創建一個集合:

MATCH (user:User {user_role: 'Customer'}) 
WITH user 
OPTIONAL MATCH (user)-[hv:HAS_VAUCHER]->(v:Vaucher {status: 2}) 
WITH user, count(hv) as hv 
WHERE hv = 0 
WITH user, COLLECT(user) AS users 
FOREACH (u IN users | CREATE (v:Vaucher {discount: 5, created_at: 1488531600, start_at: 1488531600, type: 'March', status: 2})<-[:HAS_VAUCHER]-(u)) 

「用戶」時,返回返回N個節點(而不是1),但傳遞給的foreach它時,也許只需要第一個節點。

+1

這兩種方法都可以工作。正如你發現的那樣,FOREACH對收藏進行操作。但這不是必需的,因爲您已經擁有了需要在每一行使用的所有用戶,因此只需在用戶上執行CREATE即可完成同樣的任務。 – InverseFalcon

1

可以縮短與WHERE子句不過濾部分,簡化這樣

MATCH (user:User {user_role: 'Customer'}) 
where not (user)-[:HAS_VAUCHER]->(:Vaucher {status: 2}) 
CREATE (v:Vaucher {discount: 5, created_at: 1488531600, 
start_at: 1488531600, type: 'March', status: 2})<-[:HAS_VAUCHER]-(u) 
相關問題