在Neo4j中创建唯一的链表节点/关系

时间:2013-08-21 15:38:40

标签: neo4j cypher

我正在Neo4j中实现基本访问者指标跟踪(原谅我;我是图表数据库的新手)。我有三种节点类型:访问者,会话和事件。

每当我创建一个新的Event节点时,我还想创建新的Session和/或Visitor节点,如果需要(具有相同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]关系,则删除旧关系并将新Event节点与之前的Event节点相关联(针对该同一会话)。 Sessions和Visitors的[:SESSION]关系也是如此,即:

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

我可能想知道如何使用多个查询来执行此操作,但我正在尝试学习如何正确利用图形数据库结构(并且我关注竞争条件)。

1 个答案:

答案 0 :(得分: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;
相关问题