【问题标题】:Create unique linked list nodes/relationships in Neo4j在 Neo4j 中创建唯一的链表节点/关系
【发布时间】:2013-08-24 02:01:50
【问题描述】:

我正在 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...

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

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    我不确定这是否是最好的方法,但它可以按预期工作:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-28
      • 1970-01-01
      相关资源
      最近更新 更多