2017-10-04 1 views
1

로 노드를 가져옵니다 I의 구조는 다음과 같습니다Neo4j Cypher 관련 노드의 속성을 기반으로 쿼리합니다. 최대 속성 값

(A)-[:many]->(B)-[:also_many]->(C) 

B에 이름 속성이 있습니다. C에는 날짜 속성이 있습니다. A에는 많은 B이 있고 더 나아가 각각 B에는 많은 C이 관련되어 있습니다.

BC과 함께 c.date이 가장 높습니다.

날짜는 "YYYY-MM-DD HH : MM : SS"와 같이 저장됩니다. 타임 스탬프 값을 얻으려면 apoc.date.parse(date)을 사용하고 있습니다.

진행 방법을 알아낼 수는 없습니다.

샘플 데이터 집합 : 나는 2014-04-012014-05-01B 노드에 대한 최신 관련 C 노드에 의해 말을 내 데이트를 B 노드를 반환 할

:

create (o:A {outlet: "SFO"}), (a:B {name: "Varun", date: "2017-04-01 00:00:00"}), (b:B {name: "Karen", date: "2017-04-12 00:00:00"}), (c:B {name: "Vicky", date: "2017-06-01 00:00:00"}), (aa:C {date: "2017-09-8 00:00:00", tag_no: "R2017123"}), (ab:C {date: "2017-09-02 00:00:00", tag_no: "R2017321"}), (ac:C {date: "2017-09-10 00:00:00", tag_no: "R2017423"}), (ad:C {date: "2017-09-23 00:00:00", tag_no: "R2017523"}), (ae:C {date: "2017-09-10 00:00:00", tag_no: "R2017930"}), (ba:C {date: "2017-09-02 00:00:00", tag_no:"R2017928"}), (bb:C {date: "2017-09-15 00:00:00", tag_no:"R2017039"}), (bc:C {date: "2017-09-10 00:00:00", tag_no:"R2017837"}), (bd:C {date: "2017-09-08 00:00:00", tag_no:"R2017022"}), (be:C {date: "2017-09-10 00:00:00", tag_no:"R2017883"}), (ca:C {date: "2017-09-11", tag_no:"R2017827"}), (cb:C {date: "2017-09-18", tag_no:"R2017322"}), (cc:C {date: "2017-09-21", tag_no:"R2017122"}), (cd:C {date: "2017-09-16", tag_no:"R2017877"}), (ce:C {date: "2017-09-08", tag_no:"R2017930"}), (o)-[:owns]->(a),(o)-[:owns]->(b),(o)-[:owns]->(c),(a)-[:subs]->(aa),(a)-[:subs]->(ab),(a)-[:subs]->(ac),(a)-[:subs]->(ad),(a)-[:subs]->(ae),(b)-[:subs]->(ba),(b)-[:subs]->(bb),(b)-[:subs]->(bc),(b)-[:subs]->(bd),(b)-[:subs]->(be),(c)-[:subs]->(ca),(c)-[:subs]->(cb),(c)-[:subs]->(cc),(c)-[:subs]->(cd),(c)-[:subs]->(ce);

내가 두 개의 쿼리가 필요합니다 B.date. 데이터 세트에서 나는 date을 가진 두 개의 C 노드를 가지고 있습니다. 그러나 쿼리는 B 노드 당 하나의 결과 만 반환해야합니다.

그리고 두 번째 쿼리는 다음과 같습니다

반환 날짜 범위 내에서 날짜와 C 노드가없는 위의 값 내에서 날짜 B 노드는 "2017-09"을 2017년 9월 1일 "를 말하고 -09 ".

+1

왜 이것에 대한 APOC 필요합니까? 이 형식의 날짜는 사전 식으로 정렬 할 수 있으므로 'ORDER BY c.date DESC LIMIT 1'을 사용하면 가장 큰 값을 얻을 수 있습니다. 물론, 당신이 그 날짜를 사용하기를 원한다면, 당신은 그것을 파싱해야 할 것이다. 그러나 당신은 그것을 어플리케이션 코드에서 할 수있다. –

+0

max() 함수를 사용하려고했는데이 날짜 형식이 호환되지 않습니다. – notANerdDev

+0

'사전 적으로'무엇이 있습니까? 이것은 나를위한 새로운 용어입니다. 몇 개의 노드에서 가장 높은 날짜를 얻는 함수가 있습니까? – notANerdDev

답변

1

2014-04-01 및 2014-05-01에서 날짜가있는 B 노드와 각 B 노드의 최신 관련 C 노드를 B.date로 반환하고 싶습니다. 에서 데이터 세트에는 동일한 날짜를 가진 두 개의 C 노드가 있습니다. 그러나 쿼리 은 B 노드 당 하나의 결과 만 반환해야합니다.

이 작동합니다 : 날짜 범위 내에서 날짜와 C 노드가없는 위의 값 내에서 날짜

MATCH (b:B)-[:subs]->(c:C) 
// filter b nodes by date range 
WHERE b.date >= "2017-04-01" and b.date <= "2017-04-15" 
// store c nodes into collection and get the max date for c nodes 
// grouped by b 
WITH b as b, collect(c) as cs, MAX(c.date) as maxDate 
// return b, filtering only c nodes that date are equals to maxDate 
// getting only the first filtered 
return b, filter(c in cs WHERE c.date = maxDate)[0] 

반환 B 노드를, "2017년 9월 1일 말 "및"2017-09-09 ".

그리고이 :

MATCH (b:B)-[:subs]->(c:C) 
WHERE (b.date >= "2017-04-01" and b.date <= "2017-04-15") 
AND (c.date <= "2017-09-01" and c.date >= "2017-09-09") 
RETURN b 
+0

Nah. 모든 B 노드에 대해 해당 B 노드의 모든 관련 C 노드에서 가장 높은 날짜의 C 노드가 필요합니다. – notANerdDev

+0

@notANerdDev 샘플 데이터 세트를 공유 할 수 있습니까? 이 방법은 당신을 도울 것입니다. –

+0

확인. 시간 좀주세요. 사이퍼 쿼리를 작성하여 샘플 데이터 세트를 만듭니다. 엄청 고마워. – notANerdDev

관련 문제