有趣的問題。
如果所存在的關係對於評估條件都是有意義的(例如,否:與夏威夷的ONCE_LIVED_IN關係或可能導致條件錯誤評估爲真的類似關係),並提供關係方向到一個計劃都是單向的,沒有其他外向關係可能會使一條路徑變成一個不相關的子圖,它應該是相當直接的形式來查詢。
下面是在你的描述圖中的創建查詢:
create (p:Person{name:'FTai'}), (p2:Person{name:'Hai'})
create (hi:State{name:'Hawaii'})
create (con:Condition)
create (hhc:Plan{name:'Hawaii Healthcare'})
create (ft:EmploymentStatus{name:'Full Time'})
create (pt:EmploymentStatus{name:'Part Time'})
create (con)-[:ALLOWS]->(hhc)
create (ft)-[:REQUIRED_BY]->(con)
create (hi)-[:REQUIRED_BY]->(con)
create (p)-[:HAS_STATUS]->(ft)
create (p)-[:LIVES_IN]->(hi)
create (p2)-[:HAS_STATUS]->(pt)
create (p2)-[:LIVES_IN]->(hi)
下面是開始於一個查詢:人,直至達到如下傳出關係:條件。從那裏,對於每一個:匹配的條件,我們從這些路徑中收集不同的最後一個關係:條件(應該是:REQUIRED_BY關係),並將其與進入:條件的傳入:REQUIRED_BY關係的數量進行比較。如果關係數量相同,那麼我們已滿足:REQUIRED_BY關係到:Condition中,並且可以返回連接的Plan:Plan。
MATCH (p:Person{name:'FTai'})-[r*..5]->(con:Condition)
WITH con, COLLECT(DISTINCT LAST(r)) as metRequirements
WHERE SIZE(metRequirements) = SIZE(()-[:REQUIRED_BY]->(con))
MATCH (con)-[:ALLOWS]->(plan:Plan)
RETURN DISTINCT plan
編輯
我的創作查詢不包括:DEFINED_AS狀態和就業狀況之間的關係,以及這種關係的存在會導致我公司提供的不當匹配查詢(所以海會錯誤地履行條件)。
圍繞這種障礙有幾種方法。你可以做白名單或黑名單。對於白名單,您需要提供每個有效的關係以在可變長度關係中遍歷。
如果您的查詢不應該遍歷關係類型,那麼黑名單可能會更容易。下面是查詢的更新版本,將工作即使:DEFINED_AS關係到位:
// you can add to the blacklist as needed, and change to a parameter
WITH ['DEFINED_AS'] as blacklist
MATCH (p:Person{name:'Hai'})-[r*..5]->(con:Condition)
WHERE NONE(rel in r WHERE TYPE(rel) in blacklist)
WITH con, COLLECT(DISTINCT LAST(r)) as metRequirements
WHERE SIZE(metRequirements) = SIZE(()-[:REQUIRED_BY]->(con))
MATCH (con)-[:ALLOWS]->(plan:Plan)
RETURN DISTINCT plan
狀態和位置節點是將鏈接到條件節點的唯一節點嗎?或者除了這些之外還有不同種類的條件?而且,從人類節點到條件節點的所有路徑都是沿相同的方向進行的嗎? – InverseFalcon
此外,是不同的條件節點將鏈接到相同的健康計劃,或者是這樣的1:1? – InverseFalcon
好問題。我的目標是構建一個靈活的系統,所以我不認爲狀態和位置節點是連接到狀態節點的唯一節點。目前他們是,但我預計這會隨着我發現其他情況或模擬系統變化而改變。 至於關係的方向,我正在設置,所以路徑都可以在同一個方向,我想。 最後,它不會是1:1。我預計每個「或」情況都有一個條件。多個條件容納OR,並且條件的多個鏈接允許AND。 – Daniel