2015-11-16 45 views
1

我正在使用此示例http://neo4j.com/docs/stable/cypher-cookbook-newsfeed.html來爲我的用戶維護新聞傳送。所以我用下面的發佈狀態更新:Neo4j新聞源調整

MATCH (me) 
WHERE me.name='Bob' 
OPTIONAL MATCH (me)-[r:STATUS]-(secondlatestupdate) 
DELETE r 
CREATE (me)-[:STATUS]->(latest_update { text:'Status',date:123 }) 
WITH latest_update, collect(secondlatestupdate) AS seconds 
FOREACH (x IN seconds | CREATE (latest_update)-[:NEXT]->(x)) 
RETURN latest_update.text AS new_status 

而下面來接他們:

MATCH (me { name: 'Joe' })-[rels:FRIEND*0..1]-(myfriend) 
WHERE ALL (r IN rels WHERE r.status = 'CONFIRMED') 
WITH myfriend 
MATCH (myfriend)-[:STATUS|:NEXT*0..2]-(statusupdates) 
RETURN myfriend.name AS name, statusupdates.date AS date, statusupdates.text AS text 
ORDER BY statusupdates.date DESC LIMIT 3 

這看起來簡單。新聞傳送將包含來自我的朋友的最新2個狀態更新。但是,讓我們假設我們想要選擇滿足特定條件的statusupdates。例如:

MATCH (myfriend)-[:STATUS|:NEXT*0..2]-(statusupdates {type: "photo"}) 

這似乎是工作。但是,如果某個用戶在短時間內發佈了4個狀態更新並且最新的2個不同類型的更新,則這不起作用。

比方說,在4次更新中,最新的2個是「url」類型,而之前的2個是「photo」類型。上述新聞獲取代碼簡單地忽略此用戶,因爲它看到來自該用戶的最新2個狀態更新不是「照片」類型,即使所有4個帖子比來自其他用戶的帖子都新。

回答

2

讓我們在數據庫中的一些數據,代表您的情況:

CREATE (n1:Update {id: 1, type: 'url'}) 
CREATE (n2:Update {id: 2, type: 'url'}) 
CREATE (n3:Update {id: 3, type: 'photo'}) 
CREATE (n4:Update {id: 4, type: 'url'}) 
CREATE (n5:Update {id: 5, type: 'photo'}) 
CREATE (n6:Update {id: 6, type: 'url'}) 

CREATE (n1)<-[:NEXT]-(n2)<-[:NEXT]-(n3)<-[:NEXT]-(n4)<-[:NEXT]-(n5)<-[:NEXT]-(n6) 
CREATE (user:User)-[:STATUS]->(n1) 

您的疑問:

MATCH (user:User) WITH user 
MATCH (user)-[:STATUS|:NEXT*0..2]-(statuses:Update {type: "photo"}) 
RETURN user, statuses 

如果我們執行它,那麼就像你說的,我們得到「(沒有行)」。

可能的解決辦法:

這樣的解決方案的
MATCH (user:User) WITH user 
MATCH (user)-[:STATUS|:NEXT*]-(statuses:Update {type: "photo"}) 
RETURN statuses LIMIT 2 

缺點:我們會遍歷所有狀態,然後才申請LIMIT過濾器。

遍歷運算速度相當快。您可以做的是 - 將遍歷深度與LIMIT子句相結合。例如:

MATCH (user:User) WITH user 
MATCH (user)-[:STATUS|:NEXT*0..100]-(statuses:Update {type: "photo"}) 
RETURN statuses LIMIT 2 

這是所需數據和性能之間的妥協。

但是!另外,你可以做的是 - 爲獨立的更新類型創建額外的關係鏈。

例子:

CREATE (n1:Update {id: 1, type: 'url'}) 
CREATE (n2:Update {id: 2, type: 'url'}) 
CREATE (n3:Update {id: 3, type: 'photo'}) 
CREATE (n4:Update {id: 4, type: 'url'}) 
CREATE (n5:Update {id: 5, type: 'photo'}) 
CREATE (n6:Update {id: 6, type: 'url'}) 

CREATE (n1)<-[:NEXT]-(n2)<-[:NEXT]-(n3)<-[:NEXT]-(n4)<-[:NEXT]-(n5)<-[:NEXT]-(n6) 
CREATE (n3)<-[:NEXT_PHOTO]-(n5) 
CREATE (user:User)-[:LAST_STATUS {feedType: 'main'}]->(n1) 
CREATE (user:User)-[:LAST_STATUS {feedType: 'photo'}]->(n3) 

優點:你可以很容易地獲取最高效的方式所需的數據。

缺點:數據庫中的數據模型變得更加複雜,需要額外的維護。