2016-12-29 69 views
1

我在CQL中更新任何人都可以幫助我解決查詢,查找帶有國旗的追隨者列表,如果我也跟着他。我試圖像密碼匹配查詢合併結果集

MATCH (n:users_master)-[r:FOLLOW]->(m:users_master) 
OPTIONAL MATCH (n:users_master)<-[r2:FOLLOW]-(m:users_master) 
CASE when EXISTS(r2) THEN n.flag= 1 ELSE n.flag=0 END 
where id(m)=35 
RETURN n 

通知這裏這樣,我也想在結果集中添加一個虛擬屬性標誌LIKE {"updated_at":"12/26/2016, 3:45:38 PM", "created_on":"12/26/2016, 3:45:38 PM", "last_name":"john", "first_name":"john", "email":"[email protected]", "facebook_id":"12341", "status":"Active", "id":35 "flag":1 }

+1

在可選的匹配關係對兩端的箭頭,你可能要修復起來。此外,而不是1和0,將爲您布爾返回工作?這可以非常容易地完成。 – InverseFalcon

+0

抱歉箭頭這是錯誤的,我刪除了這個 – shivshankar

回答

2

的EXISTS()函數可用於檢查是否存在一個模式,並在你的情況下可以取代你的可選匹配。

另外,如果你不打算使用它們,你的模式中的變量就不需要了,所以你根本不需要它們在你的關係上。

MATCH (n:users_master)-[:FOLLOW]->(m:users_master) 
WHERE id(m)=35 
RETURN n, EXISTS((n)<-[:FOLLOW]-(m)) as flag 

'flag'將是一個單獨的列,其布爾值是否跟隨是倒數。

只要在Neo4j 3.1+中添加'虛擬屬性',就可以使用Map Projection將自定義值添加到返回節點的地圖投影中。

您可以使用此查詢地圖投影到包括在節點屬性的迴歸的標誌:

MATCH (n:users_master)-[:FOLLOW]->(m:users_master) 
WHERE id(m)=35 
RETURN n {.*, flag: EXISTS((n)<-[:FOLLOW]-(m)) } 

編輯

在查詢中使用上述介紹,僅在Neo4j的工作地圖投影3.1.x及以上。

對於3.0.x版本,我不認爲有許多選項可以將所有節點屬性提取到地圖並在返回之前向該地圖添加新值(SET子句保留給節點而不是地圖)。

您可能需要安裝APOC procedures以解決此問題,因爲它提供了多個幫助程序和功能,其中包括map operations

APOC相關版本添加到您的Neo4j實例之後,這應該工作:

MATCH (n:users_master)-[:FOLLOW]->(m:users_master) 
WHERE id(m)=35 
RETURN apoc.map.setKey(properties(n), 'flag', EXISTS((n)<-[:FOLLOW]-(m))) as n 
+0

也只是想要注意,不建議使用neo4j節點ID查找,因爲ids被回收並在節點被刪除時重新使用。這意味着,如果節點或關係在neo4j中被刪除,並且該id被重用於一個不同的節點,那麼您存儲該id的neo4j之外的系統可能會與該id指向的位置不同步。如果需要,建議在節點上使用您自己的唯一標識,例如UUID。 – InverseFalcon

+0

感謝Falcon,但是這在neo4j> 3中不起作用。你有其他選擇嗎? – shivshankar

+0

這將在Neo4j 3.1.x及更高版本中運行。版本3.0.x沒有地圖投影功能。您可能需要使用APOC程序作爲解決方法。我用這個備用解決方案更新了我的答案。 – InverseFalcon