cypher查询中有多个可选匹配项,一个不匹配,不确定原因

时间:2013-12-21 03:32:09

标签: neo4j cypher

我一直在建模一些与呼叫路径相关的数据。一个呼叫进入系统,然后可能有人回答,然后有人转移,然后有人挂断,也许其他事情发生在两者之间。由于它们从头到尾排序,我决定将它们建模为链表:

(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:"david.foo@foo.com"} |
+-----------------------------------------------------------------------------------------------------------------------------------+

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"} |
+-------------------------------------------------------------------+

现在我想运行一个查询来获取每个事件,如果事件是一个响铃,也给我试图响铃的代理,如果事件是一个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> |
+-----------------------------------------------------------------------------------------------------------------------------------------------------+

但为什么代理无效?我知道它存在的事实。当我在cypher查询中交换两个可选匹配时,它会导致队列为空,而代理将是正确的。我不明白为什么。

为了清楚起见我使用的是neo4j-community-2.0.0-RC1。

1 个答案:

答案 0 :(得分:3)

您对两个可选匹配关系使用相同的r标识符,因此它已经在您到达第二个可选匹配时绑定,可以为null,也可以是与{{1的关系}}。所以,它永远不会匹配Queue。由于您似乎并不关心Agent,因此可以将其排除在r之外。

optional match