2017-05-12 9 views
1

私のデータ構造はとてもシンプルです。 1つのラベルは、顧客と呼ばれ、別の顧客と1対1の一方向の関係で参照されます。参照されたすべての度合いのノードの数から各ノードのカウントを取得する正しいクエリは、そのノードの結果である。すべての第1世代ノードの数を取得するneo4j

Customer 1st gen referrals 2nd gen referrals 
A   1     1 
B   1     0 
C   0     0 
+0

http://docs.neo4j.org/chunked/stable/query-functions-scalar.html#functions-length これが役に立ちます – binariedMe

答えて

0

あなたがノードに一致し、所望のパターンの大きさを見つけることができる:

MATCH (c:Customer) 
RETURN c as Customer, 
    size((c)-[:REFERRED]->()) as firstGenRef, 
    size((c)-[:REFERRED*2]->()) as secondGenRef 
データベース から成っ言い換えれば は、CustomerAはをCustomerBが結果のテーブルがあるべきCustomerC 呼ばをCustomerB、 をいいます

EDIT

すべてのレベルのリフェラルのカウントを返す限り、これは高価なクエリになる可能性がありますあなたのデータがどのように相互接続されているか。

あなたはこれを試してみることができ、それが長すぎるか、ハングを取る場合、あなたは通常、良好に動作することを、唯一遭遇した各ノードに単一のパスを保持するNODE_GLOBALの一意性を利用しており、特にapoc.path.spanningTree()APOC Proceduresに切り替えたいこと。

MATCH (c:Customer)-[r:REFERRED*]->(ref) 
WITH DISTINCT c, size(r) as gen, ref 
WITH c, gen, count(gen) as referrals 
ORDER BY gen ASC 
RETURN c as Customer, collect({gen:gen, referrals:referrals}) as referrals 

これがダウンし、顧客ごとの最大世代の深さまで、各世代での紹介の世代と多数の収集マップと一緒に、あなたの行の各顧客を取得します。

+0

大変感謝!最後の洗練。どのようにしてn世代までのノードを、どのノードの中でも最も高い度合いで知らせることができますか? – user1175817

+0

高価なクエリかもしれませんが、これに使用できるクエリを追加しました。 – InverseFalcon

関連する問題