[英]How to get all nodes in a disjointed sub-graph - neo4j / py2neo
如果我有一個neo4j數據庫,我想查詢以獲取一個特定的脫節子圖中的所有節點。 (在py2neo或cypher中)
如果我有節點組,則每個組中的節點按該組內的關系連接,但不在組之間連接。 我可以查詢一個節點並獲取該節點組中的所有節點嗎?
[更新]
如果通過“節點組”表示“不相交的子圖”,則以下是如何獲取包含特定節點(例如, Neo
節點)的不相交子圖(具有任何類型的關系)中的所有節點:
MATCH (n { name: "Neo" })
OPTIONAL MATCH p=(n)-[*]-(m)
RETURN REDUCE(s = [n], x IN COLLECT(NODES(p)) |
REDUCE(t = s, y IN x | CASE WHEN y IN t THEN t ELSE t + y END )) AS nodes;
此查詢使用OPTIONAL MATCH
查找與Neo
節點“相關”的節點,因此如果該節點沒有關系,則查詢仍然可以返回結果。
兩個(嵌套的) REDUCE
子句確保返回的集合只有不同的節點。
外部REDUCE
子句使用n
節點初始化結果集合,因為它必須始終位於不相交的子圖中,即使沒有其他節點也是如此。
MATCH p=(n { name: "Neo" })-[r*0..]-(m)
WITH NODES(p) AS nodes
UNWIND nodes AS node
RETURN DISTINCT node
這個更簡單的查詢(返回節點行)使用[r*0..]
來允許0長度路徑(即, n
不需要任何關系 - 並且m
可以與n
相同)。 它使用UNWIND
將nodes
節點集合轉換為行,然后使用DISTINCT
消除重復。
下面的這個替代解決方案(返回節點行)也應該有效,除了當前存在一個錯誤( 我剛剛報告 )導致在查詢解除NULL
之后忘記所有標識符(例如,如果OPTIONAL MATCH
無法找到匹配)。 由於此錯誤,如果Neo
節點沒有關系,則下面的查詢當前不返回任何結果。 因此,您必須使用上面的查詢,直到修復錯誤。
MATCH (n { name: "Neo" })
OPTIONAL MATCH p=(n)-[*]-(m)
WITH n, NODES(p) AS nodes
UNWIND nodes AS node
RETURN DISTINCT (
CASE
WHEN node IS NULL THEN n
ELSE node END ) AS res;
如果您添加了圖表或一些示例數據,它可能會有所幫助。 但是,如果我正確理解您的數據模型,那么您將節點的“組”定義為通過某種關系連接的所有節點? 因此,要獲取“group1”節點的所有成員(讓我們將其定義為通過group1關系連接的所有節點)而不是任何連接到group2的節點,您可以使用如下查詢:
MATCH (a:Person)-[:GROUP1]-(b:Person)
WHERE NOT exists((a)-[:GROUP2]-())
RETURN a
您還可以使用節點標簽來定義節點組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.