2017-04-14 13 views
0

は、私は、次のモードがあります。のNeo4jサイファークエリのソート順

子の各ペアDecisionCharacteristicには、値ノードが割り当てられます。

私は3子 Decisionノード、例えば

childDecision1 
childDecision2 
childDecision3 

と1 Characteristic作成した

:私は、次のペアに次の値を割り当てた

characterisitc1

を:

childDecision2 + characterisitc1 = Value(Integer 10) 
childDecision3 + characterisitc1 = Value(Integer 25) 

私は実行しています(O RDER BY sortValue88.value ASC付き)以下サイファーの問合せ:

MATCH (parentD)-[:CONTAINS]->(childD:Decision)-[ru:CREATED_BY]->(u:User) 
WHERE id(parentD) = {decisionId} 
OPTIONAL MATCH (childD)<-[:SET_FOR]->(sortValue88:Value)-[:SET_ON]->(sortCharacteristic88:Characteristic) 
WHERE id(sortCharacteristic88) = 88 
WITH ru, u, childD , sortValue88 
ORDER BY sortValue88.value ASC SKIP 0 LIMIT 100 
RETURN ru, u, childD AS decision, [ (parentD)<-[:DEFINED_BY]-(entity)<-[:COMMENTED_ON]-(comg:CommentGroup)-[:COMMENTED_FOR]->(childD) | {entityId: id(entity), types: labels(entity), totalComments: toInt(comg.totalComments)} ] AS commentGroups, [ (parentD)<-[:DEFINED_BY]-(c1:Criterion)<-[:VOTED_ON]-(vg1:VoteGroup)-[:VOTED_FOR]->(childD) | {criterionId: id(c1), weight: vg1.avgVotesWeight, totalVotes: toInt(vg1.totalVotes)} ] AS weightedCriteria, [ (parentD)<-[:DEFINED_BY]-(ch1:Characteristic)<-[:SET_ON]-(v1:Value)-[:SET_FOR]->(childD) | {characteristicId: id(ch1), value: v1.value, valueType: ch1.valueType, visualMode: ch1.visualMode} ] AS valuedCharacteristics 

私が持っている結果:

childDecision2 (Value = 10) 
childDecision3 (Value = 25) 
childDecision1 (no value provided) 

これまでのところ、すべてが正常に動作します。私が持っている結果として

MATCH (parentD)-[:CONTAINS]->(childD:Decision)-[ru:CREATED_BY]->(u:User) 
WHERE id(parentD) = {decisionId} 
OPTIONAL MATCH (childD)<-[:SET_FOR]->(sortValue88:Value)-[:SET_ON]->(sortCharacteristic88:Characteristic) 
WHERE id(sortCharacteristic88) = 88 
WITH ru, u, childD , sortValue88 
ORDER BY sortValue88.value DESC SKIP 0 LIMIT 100 
RETURN ru, u, childD AS decision, [ (parentD)<-[:DEFINED_BY]-(entity)<-[:COMMENTED_ON]-(comg:CommentGroup)-[:COMMENTED_FOR]->(childD) | {entityId: id(entity), types: labels(entity), totalComments: toInt(comg.totalComments)} ] AS commentGroups, [ (parentD)<-[:DEFINED_BY]-(c1:Criterion)<-[:VOTED_ON]-(vg1:VoteGroup)-[:VOTED_FOR]->(childD) | {criterionId: id(c1), weight: vg1.avgVotesWeight, totalVotes: toInt(vg1.totalVotes)} ] AS weightedCriteria, [ (parentD)<-[:DEFINED_BY]-(ch1:Characteristic)<-[:SET_ON]-(v1:Value)-[:SET_FOR]->(childD) | {characteristicId: id(ch1), value: v1.value, valueType: ch1.valueType, visualMode: ch1.visualMode} ] AS valuedCharacteristics 

:今私はASCからDESCにソート順方向を変更するつもりです

childDecision1 (no value provided) 
childDecision3 (Value = 25) 
childDecision2 (Value = 10) 

なぜ今、私は理解していませんchildDecision1は最初の場所を保持しますが、代わりにchildDecision3が必要です。

この現象の説明や修正にご協力いただけますか?

答えて

1

ので:だから、ソートのための可能な最小値を知っておく必要がありWhen sorting the result set, null will always come at the end of the result set for ascending sorting, and first when doing descending sort.

。たとえば、すべての値がゼロより小さくない場合

WITH [1, 0, 2, NULL, 4] AS CS 
UNWIND RANGE(0, size(CS)-1) as i 
RETURN i, 
     CASE WHEN CS[i] IS NULL THEN -1 ELSE CS[i] END AS sortValue 
ORDER BY sortValue DESC 
+0

答えていただきありがとうございます。降順ソートを行うときに最後にNULLを返すようにNeo4jを再設定する機会はありますか?私は非常に重いクエリを持っていると私の意見では、追加の条件はかなり良い選択ではない – alexanoid

+0

'CypherOrderability.compare'関数のコードを変更することができます[https://github.com/neo4j/neo4j/blob/862d62b2f2dc2221e48476ac1f6c93c91d7d6015/community/cypher /cypher-compiler-3.2/src/main/java/org/neo4j/cypher/internal/compiler/v3_2/common/CypherOrderability.java#L105]また、新しい機能をリクエストするのがよい理由です。 –

+0

ありがとう! githubの問題を作成しました。https://github.com/neo4j/neo4j/issues/9213 – alexanoid

関連する問題