我一直在建模一些与呼叫路径相关的数据。一个呼叫进入系统,然后可能有人回答,然后有人转移,然后有人挂断,也许其他事情发生在两者之间。由于它们从头到尾排序,我决定将它们建模为链表:
(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。
答案 0 :(得分:3)
您对两个可选匹配关系使用相同的r
标识符,因此它已经在您到达第二个可选匹配时绑定,可以为null,也可以是与{{1的关系}}。所以,它永远不会匹配Queue
。由于您似乎并不关心Agent
,因此可以将其排除在r
之外。
optional match