2017-06-21 6 views
1

「会話」とラベル付けされたノードから始まり、[:RESPONSE]関係の1つの長い連鎖を持つ次のパターンを実行します。複数の関係の中のCypherでのフィルタリング

このパターンには多くのノードがありますが、(解答)と(要素)の2つしか気にしません。 そして、我々は気に一つだけの関係があります:[は:RESPONSE]私が欲しいもの

(Conversation) <-[:RESPONSE]-(unimportant_node)<-[:RESPONSE] 
..()..()..()..(Answer)<-()..()..(Element)..().().()..()..().. 
(Answer)…()..(Element)<—()..()..(Answer)-..()-..(Element)<-..().() 

はALL(回答)、その関連(要素)とそれぞれを見つけることです。

可変部:会話と(Answer)と(Answer)と(Answer)と(Element)間のノード数は可変です。

不変部分:各(回答)の後に、基本的に(回答)に関連付けられている(要素)ノードがあります。次に、ある時点で、別の(回答)があり、関連した(要素)もあります。私はやってる何


: を私はすべて(回答)を取得したいので、私は(C:会話)を使用< - [:レスポンス*] - (:回答)。

次に、(回答)とその関連(要素)の間にあるノードの数がわからないので、私は再度[:RESPONSE *]を使用します。

だから、私のクエリは次のようになります。

match (c:Conversation) <- [:RESPONSE*] - (a:Answer) <-[:RESPONSE*]-(e:Element) 

これは私がFIRST(要素)にのみ興味だから、良いではありません各(回答)、次ALL(要素)をもたらし、以下のそれぞれ(答え)。

私はこのソリューション見つけるために管理しました:その後、しかし、私は単純に各(回答)した後、最初の(要素)を見つけるだろう代替ソリューションを探しています

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にMATCHを入れて試してみたが、私はにSyntaxErrorを取得します。

答えて

1

APOC proceduresをインストールしてapoc.cypher.run手順を使用して行うことができます。このような何か:あなたが行ごとに(この場合は、1)LIMITでサブクエリを実行することができ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 

+1

関連して、Brunoの答えは、Neo4jのナレッジベースの記事で[行ごとの結果を制限する](https://neo4j.com/developer/kb/limiting-match-results-perrows)に関する1つのアプローチです。偉大な仕事をすべきです。この記事では他のアプローチが言及されており、他の場合には有用かもしれません。 – InverseFalcon

+0

BrunoとInverseFalconに感謝します。私はそれを知らなかったので、APOCを調べる必要があります!提案していただきありがとうございます。 – jb007

関連する問題