我一直在建模一些与调用路径相关的数据。一个电话进入系统,然后可能有人回答,然后有人转移,然后有人挂断,也许其他一些事情发生在两者之间。由于它们是从开始下令结束,我决定把它们建模为一个链表:密码查询中的多个可选匹配,一个不匹配,不知道为什么
(call:Call)-[r:NextEvent]->(e:Event)-[r:NextEvent]->(e:Event)
等尽可能多的活动,因为这里有。要查询在通话中发生的所有事件,我可以去:
neo4j-sh (?) $ match (call:Call)-[:NextEvent*]->(lastEvent:Event) where call.callid="123"
> return lastEvent;
+------------------------------------------------------------------------------------------------------+
| lastEvent |
+------------------------------------------------------------------------------------------------------+
| Node[22]{name:"Newcall",callerid:"1231231234",calleridname:"David Foo",destination:"3213214321"} |
| Node[24]{name:"EnterQueue"} |
| Node[27]{name:"RingAttempt"} |
+------------------------------------------------------------------------------------------------------+
这非常完美。当有人进入队列时,我想知道他们在哪个队列中,并且当有人进行响铃时,我想知道电话铃响的用户,所以我添加了一些关系。
neo4j-sh (?)$ match (e:Event)-[r:Agent]->(agent:User) where e.name="RingAttempt" return e,agent;
+-----------------------------------------------------------------------------------------------------------------------------------+
| e | agent |
+-----------------------------------------------------------------------------------------------------------------------------------+
| Node[27]{name:"RingAttempt"} | Node[26]{username:"[email protected]"} |
+-----------------------------------------------------------------------------------------------------------------------------------+
neo4j-sh (?)$ match (e:Event)-[r:Queue]->(queue:Queue) where e.name="EnterQueue" return e,queue;
+-------------------------------------------------------------------+
| e | queue |
+-------------------------------------------------------------------+
| Node[24]{name:"EnterQueue"} | Node[17]{name:"Main Support Queue"} |
+-------------------------------------------------------------------+
现在,我想运行一个查询,将让每一个事件,如果事件是ringattempt,也给了我它试图敲响剂,如果事件是enterqueue,给我进入的队列,所以我试图写这个:
neo4j-sh (?)$ match p = (call:Call)-[:NextEvent*]->(lastEvent:Event) where call.callid="123"
> optional match (lastEvent)-[r:Queue]->(queue:Queue) where lastEvent.name="EnterQueue"
> optional match (lastEvent)-[r:Agent]->(agent:User) where lastEvent.name="RingAttempt"
> return lastEvent,queue,agent;
+-----------------------------------------------------------------------------------------------------------------------------------------------------+
| lastEvent | queue | agent |
+-----------------------------------------------------------------------------------------------------------------------------------------------------+
| Node[22]{name:"Newcall",callerid:"1231231234",calleridname:"David Foo",destination:"3213214321"} | <null> | <null> |
| Node[24]{name:"EnterQueue"} | Node[17]{name:"Main Support Queue"} | <null> |
| Node[27]{name:"RingAttempt"} | <null> | <null> |
+-----------------------------------------------------------------------------------------------------------------------------------------------------+
但为什么代理null?我知道它存在的事实。当我在密码查询中交换两个可选匹配项时,它会导致队列为空,并且代理将改为正确。我不明白为什么。
只是要清楚我使用的是neo4j-community-2.0.0-RC1。
啊我知道这很简单。谢谢! –