Neo4j 一个密码查询中有多个可选匹配项,一个不匹配';不匹配,不知道为什么

Neo4j 一个密码查询中有多个可选匹配项,一个不匹配';不匹配,不知道为什么,neo4j,cypher,Neo4j,Cypher,我一直在为一些与呼叫路径相关的数据建模。一个电话进入系统,然后可能有人接听,然后有人转接,然后有人挂断电话,也许中间会发生其他事情。因为它们是从头到尾排序的,所以我决定将它们建模为一个链表: (call:Call)-[r:NextEvent]->(e:Event)-[r:NextEvent]->(e:Event) 等等,尽可能多的活动。要查询通话中发生的所有事件,我可以: neo4j-sh (?) $ match (call:Call)-[:NextEvent*]->(las

我一直在为一些与呼叫路径相关的数据建模。一个电话进入系统,然后可能有人接听,然后有人转接,然后有人挂断电话,也许中间会发生其他事情。因为它们是从头到尾排序的,所以我决定将它们建模为一个链表:

(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"} |
+-------------------------------------------------------------------+
现在,我想运行一个查询来获取每个事件,如果该事件是一个RingAttement,请同时给我它试图调用的代理,如果该事件是一个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> |
+-----------------------------------------------------------------------------------------------------------------------------------------------------+
neo4j sh(?)$match p=(call:call)-[:NextEvent*]->(lastEvent:Event)其中call.callid=“123”
>可选匹配(lastEvent)-[r:Queue]->(Queue:Queue)其中lastEvent.name=“EnterQueue”
>可选匹配(lastEvent)-[r:Agent]->(Agent:User)其中lastEvent.name=“ringtrunt”
>返回lastEvent、queue、agent;
+-----------------------------------------------------------------------------------------------------------------------------------------------------+
|lastEvent |队列|代理|
+-----------------------------------------------------------------------------------------------------------------------------------------------------+
|节点[22]{name:“Newcall”,callerid:“1234”,calleridname:“davidfoo”,destination:“3213214321”}||
|节点[24]{name:“EnterQueue”}|节点[17]{name:“主支持队列”}||
|节点[27]{name:“ringtrunt”}|||
+-----------------------------------------------------------------------------------------------------------------------------------------------------+
但为什么代理是空的?我知道它确实存在。当我交换cypher查询中的两个可选匹配项时,它会导致队列为null,而代理将是正确的。我不明白为什么


需要明确的是,我使用的是neo4j-community-2.0.0-RC1。

您对两个可选匹配关系使用了相同的
r
标识符,因此当您到达第二个可选匹配时,它已经被绑定,要么为null,要么作为与
队列的关系。因此,它永远不会与
代理匹配。由于您似乎并不关心
r
,因此可以将其从
可选匹配中删除

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;

啊,我知道这很简单。非常感谢。