我有一個由 [IS_A] 相關的父子物件圖,這些物件可能彼此相關 [HAS]:

假設屬性由孩子繼承。我想創建一個可以回答所有問題的查詢:
卡片表有基礎嗎?- (l {name:'card table'})-[:IS_A*]->(m)-[:HAS]->(n)-[:IS_A*]->(o {name:'base'} )
牌桌有腿嗎?- (l {name:'card table'})-[:IS_A*]->(m)-[:HAS]->(o {name:'leg'})
家具有底座嗎?- (l {name:'furniture'})-[:HAS]->(n)-[:IS_A*]->(o {name:'base'})
家具有腿嗎?- (l {name:'furniture'})-[:HAS]->(o {name:'leg'})
不知道我的物件將匹配什么模式我想在一個查詢中一次測驗它們。這是對我有意義但不起作用的查詢:
MATCH (l {name:'X'}), (m), (n), (o {name:'Y'})
WHERE (l)-[:IS_A*]->(m)-[:HAS]->(n)-[:IS_A*]->(o) OR (l)-[:IS_A*]->(m)-[:HAS]->(o) OR (l)-[:HAS]->(n)-[:IS_A*]->(o) OR (l)-[:HAS]->(o)
RETURN l, m, n, o
一一在哪兒作業。但總的來說,我得到了資料庫中的每個節點和關系!
uj5u.com熱心網友回復:
哦,伙計,我是一個叮當聲,我應該只回傳 l,o
如果我回傳 m、n 和 m,n 不是查詢的子項,那么我間接地要求一切。
所以正確的查詢是: MATCH (l {name:'X'}), (m), (n), (o {name:'Y'})
WHERE (l)-[:IS_A*]->(m )-[:HAS]->(n)-[:IS_A*]->(o) OR (l)-[:IS_A*]->(m)-[:HAS]->(o) OR (l) )-[:HAS]->(n)-[:IS_A*]->(o) OR (l)-[:HAS]->(o)
RETURN l, o
如果我得到任何節點回傳,答案是 YES否則否
uj5u.com熱心網友回復:
更好的方法可能是找到一個特征的所有后代,并為這些后代找到所有擁有者。這些將是具有該特征的事物的集合:
(characteristic)<-[:IS_A*0..]-(descendent)<-[:HAS]-(possessor)
您可以匯總這些(或使用模式理解,以便它們已在串列中)
現在,對于測驗中的給定專案,您所要做的就是查看它是否有任何祖先在擁有者串列中。
我們可以使用 LIMIT 1 使其更快,因為我們只需要在找到的第一個匹配項處停止。
MATCH (characteristic:Thing {name:$characteristic}), (thing:Thing {name:$thing})
WITH characteristic, thing,
[(characteristic)<-[:IS_A*0..]-(descendent)<-[:HAS]-(possessor) | possessor] as possessors
MATCH path = (thing)-[:IS_A*0..]->(ancestor)
WHERE ancestor IN possessors
RETURN ancestor
LIMIT 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/314607.html
上一篇:面向物件編程:子類或列舉
