2016-04-21 7 views
0

グラフトラバーサルのいくつかのルールベースに応じて、ユーザーのエッジを強調したいと思います。合計でのcypherユニオングループ

select id, sum(weight) as total 
from 
(
    select id, 10 as weight 
    from user 
    inner join userRel1 ON user.id = userRel1.userId 
    where userRel1.attr1 in (1, 2) 
    union 
    select id, 5 as weight 
    from user 
    inner join userRel2 ON user.id = userRel2.userId 
    inner join userRel3 ON user.id = userRel3.userId 
    where userRel2.attr2 = 'a' and userRel3.attr2 = 'z' 
    union 
    ... 
) 
group by id 
order by total desc 

はまた、私はすでにグレムリン3でいくつかの助けを借りて、このクエリをwritedしているが、私はCYPHERでパフォーマンスを比較したいと思います:基本的にMySQLでは、私はそれを行うだろう。しかし、私はこのpostで、組合でのグループはまだ可能ではないことを読むと、それはサイファーがグレムリンより強力でないことを意味しますか?それを達成するためにエッジのプロパティとしてウェイトを設定する必要がありますか?

おかげ

答えて

0

ポストUNION処理がstill an open feature requestで、あなたのユースケースを実行するためにUNIONを使用する必要はありませんというのは本当ですが。

このクエリは、(不完全な部分を無視して)あなたのSQLの同等の操作を行う必要があります。

WITH [] AS res 

OPTIONAL MATCH (user1:User), (userRel1:UserRel1) 
WHERE user1.id = userRel1.userId AND userRel1.attr1 IN [1, 2] 
WITH res, (CASE WHEN userRel1 IS NOT NULL THEN COLLECT({id: user1.id, weight: 10}) ELSE [] END) AS data 
WITH res + data AS res 

OPTIONAL MATCH (user2:User), (userRel2:UserRel2) 
WHERE user2.id = userRel2.userId AND userRel2.attr2 = 'a' 
OPTIONAL MATCH (userRel3:UserRel3) 
WHERE user2.id = userRel3.userId AND userRel3.attr2 = 'z' 
WITH res, (CASE WHEN userRel3 IS NOT NULL THEN COLLECT({id: user2.id, weight: 5}) ELSE [] END) AS data 
WITH res + data AS res 

UNWIND res AS result 
RETURN result.id, SUM(result.weight) AS weight; 

私は視覚的に読みやすくするために、サイファーの別々のブロックにこのクエリを解散しました。

クエリは、適切なid/weightのペアでresコレクションを拡張(および置き換え)してから、最後に集計します。

2つのOPTIONAL MATCH句を持つブロックは、単一OPTIONAL MATCHを使用して書かれている可能性が、私はそれがよりパフォーマンスだと思った断片的に同じ作業を行うと、1 OPTIONAL MATCHの故障が潜在的にも、と気にしないためにサイファーに通知できるようにしますもう一つの方。ブロックの2番目のWHERE句は、最初のOPTIONAL MATCHによって見つかったuser2ノードに依存します。 user2は、最初にOPTIONAL MATCHが失敗した場合にはNULLの値を持ち、そのようなNULLの値は、2番目のWHERE句が失敗する原因となります(userRel3NULLとなります)。

+0

ありがとうございます。私はそのようなクエリに基づいてneo4jパフォーマンスの問題でより一般的な新しい投稿を開きました:http://stackoverflow.com/questions/36789389/mysql-vs-cypher-vs-gremlin-on-union-query – jrweb247

+0

素晴らしい。あなたが受け入れる答えをupvoteすることを覚えておいてください。 – cybersam

関連する問題