2017-06-21 72 views
1

采用以下模式,该模式以标有“对话”的节点开始,并且具有[: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。

回答

1

您可以安装APOC procedures和使用apoc.cypher.run程序做到这一点。事情是这样的:

MATCH (c:Conversation)<-[:RESPONSE*]-(a:Answer) 
CALL apoc.cypher.run(' 
    WITH {a} AS a 
    MATCH (a)-[:RESPONSE*]->(e:Element) 
    RETURN e LIMIT 1', 
    {a:a}) YIELD value 
RETURN c, value.e 

随着apoc.cypher.run你可以每行与LIMIT执行子查询(1,在这种情况下)。

+1

相关,布鲁诺的答案是一个办法由Neo4j的知识库文章上[每行限制结果]提到(https://neo4j.com/developer/kb/limiting-match-results-per-row/),和应该很好。文章中提到了其他方法,在其他情况下可能有用。 – InverseFalcon

+0

谢谢布鲁诺和InverseFalcon。我需要关注APOC,因为我没有意识到!感谢您的建议。 – jb007