如果我有一個neo4j數據庫,並且我想要查詢以獲取在一個特定的不連貫的子圖中的所有節點。 (在py2neo或cypher中)如何獲得不連貫的子圖中的所有節點 - neo4j/py2neo
如果我有一組節點,則每個組中的節點通過該組內的關係進行連接,但不在組之間進行連接。我可以查詢一個節點並獲取該節點組中的所有節點嗎?
如果我有一個neo4j數據庫,並且我想要查詢以獲取在一個特定的不連貫的子圖中的所有節點。 (在py2neo或cypher中)如何獲得不連貫的子圖中的所有節點 - neo4j/py2neo
如果我有一組節點,則每個組中的節點通過該組內的關係進行連接,但不在組之間進行連接。我可以查詢一個節點並獲取該節點組中的所有節點嗎?
[增訂]
如果「節點組」你的意思是「不相交的子圖」,這裏是你如何能得到的不相交子圖的所有節點(與任何關係類型),其中包含一個特定節點(比如,在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
消除重複。
下面這個替代的解決方案(返回節點行)也應該有工作,但當前存在的bug(that I just reported),導致所有標識符在查詢展開NULL
(例如,如果OPTIONAL MATCH
未能找到匹配時可能發生),將被遺忘。由於此錯誤,如果Neo
節點沒有關係,則下面的查詢當前不會返回任何結果。因此,您必須使用上面的查詢,直到bug修復。
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;
如果您添加圖表或一些示例數據,它可能會有所幫助。但是,如果我正確理解您的數據模型,則將「節點組」定義爲通過某種關係連接的所有節點?因此,要獲得連接到組2,你可以使用這樣的查詢「組1」的節點(我們定義爲一個組1的關係連接的所有節點),而不是任何節點的所有成員:
MATCH (a:Person)-[:GROUP1]-(b:Person)
WHERE NOT exists((a)-[:GROUP2]-())
RETURN a
您還可以使用Node labels定義節點組。
您是否在尋找連接的組件?你如何模型模型看起來像? –