簡體   English   中英

如何在一個脫節的子圖中獲取所有節點 - neo4j / py2neo

[英]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相同)。 它使用UNWINDnodes節點集合轉換為行,然后使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM