처럼 보이는 neo4j의 그래프가 있습니다. 나는 그것을 this과 같은 것으로 만들고 싶습니다.Neo4j : 하위를 탐색하고 속성을 기반으로 어린이들 간의 순서 관계를 만듭니다.
일반화 된 문제 :
어떻게 (날짜 별, 예를 들어 순서) 특정 순서로 자녀를 통과하고 주어진 순서대로 자녀 사이의 관계를 만들려면 어떻게해야합니까?
특정 문제 :
각 : (: 진단) 노드 및 다중 (: 진단) 노드가 동일한 공유 할 수 있습니다 (: 개념) (사람) 여러가있을 수 있습니다. "조건"으로 표시된 노드는 (: 개념) 노드입니다. (: 진단) 노드는 사람에 대한 진단 발생을 나타내므로 두 사람이 (진단) 노드를 공유하지 않습니다. 그러나 여러 사람이 동일한 종류의 진단으로 진단 될 수 있으며 진단 유형 (예 : 2 형 당뇨병, 동맥류 등)은 (: 개념) 노드로 설명됩니다.
(: Diagnosis) 노드의 시간 순서에 따라 (: Concept) 노드 간의 관계 경로를 만들고 각 (: Concept)가 처음 진단되었을 때만 포함하고 싶습니다.
지금까지 내가 만든 한 새 사이의 관계 (: 사람)과이 같은 (개념) : 나는 하나의 물건을 테스트했습니다
(:Person {person_id: <some_number>})-[:DIAGNOSED_WITH {start_date: yyyy/mm/dd}]->(:Concept)
(: 사람). 나는 다음과 같은 사이퍼 쿼리 이런 짓을 : 관계 : [DIAGNOSED_WITH]의 시작 날짜를 기준으로 (개념) 노드
match (p:Person {person_id: "12345"})--(c:ConditionOccurrence)--(con:Concept) WITH
p.person_id as people, con.concept_id as concepts, min(c.condition_start_date) as
start_date ORDER BY start_date, concepts
MATCH (p1:Person {person_id: people})
MATCH (c2:Concept {concept_id: concepts})
MERGE (p1)-[:DIAGNOSED_WITH {start_date: start_date}]->(c2)
가 지금은 사이의 관계를 만들려고합니다. 그것은 다음과 같이 보일 것이다 : [: DIAGNOSED_WITH] 주어진에 대한 관계
(concept 1)-[:NEXT {person_id: #}]->(concept 2)-[:NEXT {person_id: #})]->(concept 3)...
나는 모든 모음에 UNWIND
를 사용하여 시도 (: 사람)하지만 난 꽤 WITH
와 방법 UNWIND
작품을 이해 생각하지 않습니다. 내가 통해 갈 곳
match (p:Person {person_id: "12345"})-[d:DIAGNOSED_WITH]->(c:Concept) WITH
p.person_id AS person_id, d AS diagnoses ORDER BY d.start_date
WITH collect(diagnoses) as ordered_diagnoses, person_id as person_id
UNWIND ordered_diagnoses as diagnosis
MATCH (:Person {person_id: person_id})-[diagnosis]->(c1:Concept)
MATCH (:Person {person_id: person_id})-[d2:DIAGNOSED_WITH]->(c2:Concept) WHERE
d2.start_date >= diagnosis.start_date AND d2 <> diagnosis
WITH min(d2.start_date) AS min_start_date2, diagnosis, person_id, c1
MATCH (:Person {person_id: person_id})-[:DIAGNOSED_WITH {start_date:
min_start_date2}]->(c2:Concept)
MERGE (c1)-[:NEXT {person_id: person_id, start_date1: diagnosis.start_date,
start_date2: min_start_date2}]->(c2)
나는 또한 "터치"접근을 시도 : (: 개념) 진단이 동일한 날짜에 시작에 만들어진 노드
다음 쿼리는 모든 사이의 관계를 그려 보인다
match (p:Person {person_id: "2851389"})-[d:DIAGNOSED_WITH]->(c:Concept) WITH
p.person_id AS person_id, d AS diagnoses ORDER BY d.start_date
WITH collect(diagnoses) as ordered_diagnoses, person_id as person_id
UNWIND ordered_diagnoses as diagnosis
MATCH (:Person {person_id: person_id})-[diagnosis]->(c1:Concept)
SET diagnosis.touched = TRUE
WITH person_id, c1, diagnosis
MATCH (:Person {person_id: person_id})-[d2:DIAGNOSED_WITH {touched: FALSE}]->
(c2:Concept) WHERE d2.start_date >= diagnosis.start_date
SET d2.touched = TRUE
WITH min(d2.start_date) as min_start_date2, person_id, c1, diagnosis
MATCH (:Person {person_id: person_id})-[:DIAGNOSED_WITH {start_date:
min_start_date2}]->(c2:Concept)
MERGE (c1)-[:NEXT {person_id: person_id, start_date1: diagnosis.start_date,
start_date2: min_start_date2}]->(c2)
이 도와주세요 : 관계와 이미 발생한 터치 것들,하지만 코드는 나도 인해 UNWIND
및 WITH
의 이해 나의 부족에 원하는 방식으로 작동하지 않습니다! 감사!