2016-02-19 138 views
1

我有一個tweet節點的數據庫,每個tweet都有一個userId字段,並根據tweet是否回覆來建立關係。我試圖編寫一個查詢,將用戶分組的所有推文進行分組,同時保留推特關係以查看用戶之間的關係。neo4j Cypher分組

到目前爲止,我有

匹配(N:鳴叫)返回不同的(n.userId),正

但是,這並不工作,因爲關係不保留。有人知道怎麼做這個嗎?

+0

什麼是您的數據模型?顯示節點(和節點標籤),關係類型以及這些關係類型如何連接節點。 – cybersam

回答

1

在回覆您的評論時添加另一個答案。

所以,如果你想了解如果用戶已經有過一次交談,你可以這樣做:

MATCH (source_tweet:Tweet)<-[:REPLY_TO]-(reply_tweet:Tweet) 
MATCH 
    (source_user:User {userId: source_tweet.user}), 
    (reply_user:User {userId: reply_tweet.user}) 
CREATE UNIQUE reply_user-[:REPLIED_TO]->(source_user) 

然後,你可以這樣做:

MATCH (user1)-[:REPLIED_TO]-(user2) 
WHERE ID(user1) < ID(user2) 
RETURN user1.userId, user2.user_id 

...把​​所有的組合。

雖然就像我說的,你應該確實有推文和用戶之間的關係,指出哪些用戶發佈了推文。如果你有這樣的查詢可能是這樣的:

MATCH (source_user:User)-[:WROTE]->(source_tweet:Tweet)<-[:REPLY_TO]-(reply_tweet:Tweet)<-[:WROTE]-(reply_user:User) 
CREATE reply_user-[:REPLIED_TO]->(source_user) 

而這也應該是更快,因爲你正在做的關係遍歷,而不是在userId索引裏。

+0

答案中的第一個查詢(MATCH(source_tweet:Tweet)< - [:REPLY_TO] - (reply_tweet:Tweet)...)參考用戶節點。此查詢是否假定我有用戶節點,或者查詢是否創建用戶節點? –

+0

它都假設你有'用戶'節點。如果你不這樣做,你可以做'匹配(source_tweet:鳴叫)< - [:REPLY_TO] - (reply_tweet:鳴叫)WHERE source_tweet.userId

+0

反正有沒有創建新的[:已回覆的_To]關係? –

1

我不太清楚你在問什麼......你在談論關係,但你沒有匹配任何關係。

一般地說,當您使用在RETURN(或WITH)聚合函數(如sumcountcollect,等...)子句的Neo4j會自動在從句中其他列組。下面是你可能會做東西的例子:

MATCH (source_tweet:Tweet {userId: 1234})<-[:RETWEET_OF]-(retweet:Tweet) 
RETURN source_tweet:Tweet.id, source_tweet:Tweet.text, count(retweet) 

這會給你每個鳴叫用戶id#1234取得了和銳推爲每個鳴叫的次數的計數一行。

+0

這不是我想要做的。在數據庫中,我有許多具有相同userId參數值的推文(意思是同一用戶推特推文)。目前我的數據庫有這些長回覆鏈,其中一個用戶回覆到另一個用戶,然後用戶回覆,等等。我真正關心的是兩個用戶連接在一起。我想簡化兩個用戶節點之間的一個關係的答覆鏈。 –

+0

這很有道理,雖然在Neo4j中有一個外鍵是一種代碼味道,我會說。我會在它們上創建具有'id'或'userId'屬性的'User'對象,並在推文和用戶之間建立關係。 –