2017-04-14 3 views
0

는 나는 다음과 같은 모드가 있습니다.Neo4j 사이퍼 쿼리 정렬 순서

각 쌍의 자식 DecisionCharacteristic에는 값 노드가 할당 될 수 있습니다.

내가 예를

childDecision1 
childDecision2 
childDecision3 

Characteristic를 들어, 3 자녀 Decision 노드를 만든

:

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

characterisitc1

나는 다음과 같은 쌍의 값 다음 할당

나는 실행 중입니다. (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) 

지금까지 모든 것이 잘 작동합니다.

는 지금은 ASC에서 DESC에 정렬 순서 방향을 변경하려고 해요 :

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 

결과로 내가 가진 :

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.

그래서 당신은 정렬 가능한 최소 값을 알 필요가있다. 예를 들어, 모든 값이 0보다 작지 않은 경우

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