采用以下模式,该模式以标有“对话”的节点开始,并且具有[:RESPONSE]关系的一条长链。在多重关系中的Cypher中过滤
该模式中有许多节点,但我们只关心其中的2个:(答案)和(元素)。 而且有我们关心的只有一个关系:[:RESPONSE]
(Conversation) <-[:RESPONSE]-(unimportant_node)<-[:RESPONSE]
..()..()..()..(Answer)<-()..()..(Element)..().().()..()..()..
(Answer)…()..(Element)<—()..()..(Answer)-..()-..(Element)<-..().()
我要的是找出所有的(答案),每个都有其相关的(元)。
可变部分:节点(对话)和(应答),并且还之间(应答)和(元件)之间的数量是可变的。
不变部分:在每个(Answer)之后都有一个(Element)节点,它基本上与那个(Answer)相关联。然后,在某个时候,还有另一个(答案),它也有一个关联的(元素)。
我在做什么: 因为我想检索所有的(答案),我用(C:会话)< - [:RESPONSE *] - (A:答案)。然后,因为我不知道有多少个节点在(Answer)和它的关联(Element)之间,所以我再次使用[:RESPONSE *]。
所以,我的查询看起来是这样的:
match (c:Conversation) <- [:RESPONSE*] - (a:Answer) <-[:RESPONSE*]-(e:Element)
这种把所有的(元素)以下每一个(答案),这是不好的,因为我只在FIRST(元)以下感兴趣每个(答案)。
我还是设法找到这个解决方案:
match (c:Conversation) <- [:RESPONSE*] - (a:Answer) <- [:RESPONSE*] - (e:Element)
with c,a,head(collect(e)) as first_e //could also use: collect(e)[0] as first_e
...code continues...
不过,我在寻找每个(答)后的替代解决办法,只是简单地找到第一个(元素),然后停止,从而使Cypher的工作少得多。
玩这个,我已经注意到,如果我想要,只带第一个(答案)是很容易的。 (但在我的情况下,我想要所有人,所以我没有这样做)。
match (c:Conversation) <- [:RESPONSE*] - (a:Answer) <- [:RESPONSE*]-(e:Element)
where not( (:Answer)<- [:RESPONSE]-(a) )
我想通必须有应用该技术的每个(答)后,只带了第一个(元素)一个简单的方法,所以我尝试:
match (c:Conversation) <- [:RESPONSE*]-(a:Answer)
with c,a
match (a) <-[:RESPONSE*]-(e:Element)
where not((:Answer)<- [:RESPONSE]-(a))
不幸的是,这逻辑不适用于for_each(Answer)作用域,而是应用于整个查询。因此,这只会带来1列结果:
conversation | the_very_last_Answer | the_very_last_element
我也试图把这场比赛在foreach,但我得到一个SyntaxError。
相关,布鲁诺的答案是一个办法由Neo4j的知识库文章上[每行限制结果]提到(https://neo4j.com/developer/kb/limiting-match-results-per-row/),和应该很好。文章中提到了其他方法,在其他情况下可能有用。 – InverseFalcon
谢谢布鲁诺和InverseFalcon。我需要关注APOC,因为我没有意识到!感谢您的建议。 – jb007