1

我正在 Neo4j 中实现基本的访问者指标跟踪(请原谅我;我通常是图形数据库的新手)。我有三种节点类型:Visitor、Session 和 Event。

每次创建新的事件节点时,如果需要,我还想创建新的会话和/或访客节点(具有相同 ID 的节点尚不存在)。这是我尝试过的:

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...

我可能会弄清楚如何使用多个查询来做到这一点,但我正在尝试学习如何正确地利用图形数据库结构(而且我担心竞争条件)。

4

1 回答 1

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;
于 2013-08-21T21:57:49.083 回答