2016-06-25 37 views
0

Neo4jは比較的新しいので、この質問に対する明らかな答えがある場合はお詫び申し上げます。私はユーザーノード、アカウントノード、およびそれらの間のASSIGNED_TO関係を持つDBを持っています。私は、ユーザーと割り当てられたアカウントを取得するためのクエリ(下記)がありますが、LIMIT/SKIPの結果に関係なく、同じクエリで見つかったユーザーの数を取得したいと考えています。何が起こっているかのように、ユーザーカウントはMATCHクエリの結果ではなく、OPTIONAL MATCH結果に基づいています。Neo4jノードとノード数を同時に取得する

データベースに3人のユーザーと3人のアカウントがあり、2人のユーザーに2人のユーザーが割り当てられ、1人のユーザーに1人のアカウントのみが割り当てられています。

これはクエリです:

 
    MATCH (user:User) 
    WITH user 
    OPTIONAL MATCH (user)-[assigned:ASSIGNED_TO]-(account:Account) 
    RETURN user, count(user) as userCount, collect(account) as accounts 
    SKIP 0 LIMIT 25 

これが結果です:

 
    user  userCount accounts 
    {id: 2} 1   [{id: 2}] 
    {id: 1} 2   [{id: 2}, {id: 1}] 
    {id: 3} 2   [{id: 1}, {id: 3}] 

私はUSERCOUNT値は、すべての行の3になりたいです。 'count(user)'を 'count(DISTINCT user)'に変更すると、userCountに1が与えられます。可能であれば、2つの個別のクエリを実行しないようにしたい。

答えて

2

コレクト・アンワインドのペアは、トリック

MATCH (user:User) 
WITH collect(user) as users, count(DISTINCT user) as userCount 
UNWIND users as user 
OPTIONAL MATCH (user)-[assigned:ASSIGNED_TO]-(account:Account) 
RETURN user, userCount, collect(account) as accounts 
SKIP 0 LIMIT 25 
+0

パーフェクトを行う必要があります!正確に私が必要としたもの。ありがとう。 – Jason

+1

非常に効果がありません - プロファイラのクエリを見てください。 –

3
// Get user count 
MATCH (user:User) WITH count(user) as userCount 
// Get user 
MATCH (user:User) 
// To optimize a query, first apply the pagination 
WITH user, userCount SKIP 0 LIMIT 25 
// The other part of query 
OPTIONAL MATCH (user)-[assigned:assigned_to]-(account:Account) 
RETURN user, 
     userCount, 
     collect(distinct account) as accounts 
+0

それは私の愚かだった。この場合、2つのクエリに分解することは明らかに優れています。いい答え! –

+0

これは、dbヒットと実行時間が同じように見えます。どのように効果的ですか?私は数週間だけneo4jを使用していたので、私の無知を許してください。 – Jason

+0

3.0。この答えを使用する場合、MATCHクエリごとにWHERE句を再現する必要はありませんか? – Jason

関連する問題