2013-12-21 34 views
2

我一直在建模一些与调用路径相关的数据。一个电话进入系统,然后可能有人回答,然后有人转移,然后有人挂断,也许其他一些事情发生在两者之间。由于它们是从开始下令结束,我决定把它们建模为一个链表:密码查询中的多个可选匹配,一个不匹配,不知道为什么

(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。

回答

3

您对两个可选匹配关系使用相同的r标识符,因此它已被第二个可选匹配项的时间绑定,可以为空或与Queue的关系。所以,它永远不会匹配Agent。由于您似乎不在乎r,因此您可以将其保留在optional match之外。

match p = (call:Call)-[:NextEvent*]->(lastEvent:Event) where call.callid="123" 
optional match (lastEvent)-[:Queue]->(queue:Queue) where lastEvent.name="EnterQueue" 
optional match (lastEvent)-[:Agent]->(agent:User) where lastEvent.name="RingAttempt" 
return lastEvent,queue,agent; 
+0

啊我知道这很简单。谢谢! –