我在neo4j中有一個圖,看起來像this。我想把它變成類似this的東西。Neo4j:遍歷兒童並基於屬性創建兒童之間的有序關係
廣義的問題:
你如何遍歷孩子按照一定的順序(例如按日期順序),在給定的順序創建孩子之間的關係?
具體問題:
每個(:人)可具有多個(:診斷)節點,和多個(:診斷)節點可以共享相同的(:概念)。標記爲「條件」的節點是(:概念)節點。 (:診斷)節點表示一個人的診斷的發生,因此沒有兩個人共享(:診斷)節點。然而,多個人可以被診斷爲具有相同類型的診斷,並且診斷類型(例如II型糖尿病,動脈瘤等)由(:Concept)節點描述。
我想根據(:診斷)節點的時間順序創建(:概念)節點之間的關係路徑,並且我只想包括第一次每個(:概念)被診斷。
到目前爲止,我已經取得了新關係(:人)和(:概念)是這樣的:
(:Person {person_id: <some_number>})-[:DIAGNOSED_WITH {start_date: yyyy/mm/dd}]->(:Concept)
我一直在測試的東西出來一(:人)。我這樣做有以下CYPHER查詢:
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
[:DIAGNOSED_WITH]對於給定的關係(:人),但我不認爲我很瞭解UNWIND
作品與WITH
。
下面的查詢,似乎剛剛繪製所有的關係
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)
我還嘗試了「觸」的方法,我都要經過:(:概念),在診斷上相同的開始日期由節點關係,我已經遇到過接觸的人,但代碼不工作,我想無論是由於我缺乏的UNWIND
和WITH
理解方式:
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)
請幫幫忙!謝謝!