2013-08-21 101 views
1

我在Neo4j中實現了基本的訪問者度量跟蹤(原諒我;我是圖形數據庫的新手)。我有三種節點類型:訪問者,會話和事件。每當我創建一個新的事件節點時,如果有必要,我還想創建新的會話和/或訪問者節點(具有相同ID的節點尚不存在)。以下是我已經試過:在Neo4j中創建唯一鏈接列表節點/關係

CREATE UNIQUE 
(e:Event { type: 'pageview' })<-[:ACTION]-(s:Session { id: 'ABC'})<-[:SESSION]-(v:Visitor { id: '123' }) 
RETURN e,s,v; 

這提供了以下錯誤:Unbound pattern!,這是有道理的,因爲我還沒有明確的約束什麼參考節點。不過,我希望能夠以利用索引中存在的任何一種方式編寫查詢,並創建任何缺失的內容。

我使用的是2.0版(含標籤),並創建了以下指標:

CREATE INDEX on :Session(id); 
CREATE INDEX on :Visitor(id); 

此外,我想實現鏈表在會話事件和會話數遊客。基本上,如果存在先前存在的[:ACTION]關係,請刪除舊的關係,並將新的事件節點與前一個事件節點(針對同一個會話)相關聯。這同樣適用於會議和遊客與他們的[:SESSION]的關係,即:

curSession-[:ACTION]->curEvent-[:PREV]->prevEvent... 
visitor-[:SESSION]->curSession-[:PREV]->prevSession... 

我也許可以想出如何與多個查詢做到這一點,但我努力學習如何正確地利用圖數據庫結構(我擔心競爭條件)。

回答

0

我不知道這是否是做的最好的方式,但它按預期工作:

start root=node(0) 
create unique root-[:VISITOR]->(v:Visitor { vid: '123' }) 
create unique v-[:SESSION]->(s:Session { sid: 'ABCD' }) 
create s-[:EVENT]->(e:Event { type: 'pv' }) 
with v,s,e 
match s-[r1:EVENT]->oldEvent:Event 
where not(id(oldEvent) = id(e)) 
create e-[:NEXT]->oldEvent 
delete r1 
with v,s 
match v-[r2:SESSION]->oldSession:Session 
where not(id(oldSession) = id(s)) 
create s-[:NEXT]->oldSession 
delete r2;