簡體   English   中英

Neo4j,獲取一組節點之間的所有關系

[英]Neo4j, get all relationships between a set of nodes

我有一個基於屬性獲取節點的查詢

MATCH (c { type: 'sometype' })
WITH c LIMIT 100
RETURN c

我想要的只是獲取結果集中節點之間的所有關系,在 IRC 上有人告訴我使用:

MATCH (c { type: 'sometype'])
WITH c LIMIT 100
OPTIONAL MATCH (c)-[r]-()
RETURN c, r

但這將包括從節點 c 到結果集之外的節點的關系,在我的情況下(數十萬個關系)可能會產生非常大的無用結果集或性能問題)

有什么辦法可以實現嗎?

我想有多種方法可以做到這一點。 一種方法是找到給定類型的所有節點並從中構建集合( cs )。 然后再次匹配該組,這次與任何節點的傳出關系並過濾以確保endnode在cs

MATCH (c {type:'sometype'})
WITH collect(c) as cs
MATCH (x {type:'sometype'})-[r]->(y)
WHERE y in cs
RETURN startNode(r).name, endNode(r).name

不知道你的圖模型,但我認為這可能是重構的財產是一個好主意type='sometype'成標簽sometype 在這種情況下,查詢將如下所示:

MATCH (c:Group1)   
WITH collect(c) as cs
MATCH (x:Group1)-[r]->(y)
WHERE y in cs
RETURN startNode(r).name, endNode(r).name

這是直截了當的。

MATCH (a)-[r]-(b)
WHERE a.type = 'foo' AND b.type = 'foo'
RETURN DISTINCT r

您可以同樣使用新語法:

MATCH (a { type : 'foo' }) -[r] - (b {type : 'foo'})
RETURN DISTINCT r

如果你喜歡它。

亞歷克斯,

另一種方法是這個查詢:

MATCH (c {type : 'sometype'})-[r:*0..1]-(d {type : 'sometype'})
WITH c, collect(r) as rs
RETURN c, rs

這允許沒有這種關系的情況。

恩典與和平,

吉姆

如果你使用標簽而不是類型的屬性,那就更好了。 這將使用模式索引使您的查詢非常快。

MATCH (a:SOMETYPE) -[r] - (b :SOMETYPE) RETURN DISTINCT r

要盡量減少必要的匹配,您可以嘗試這樣做:

MATCH (c { type: 'sometype'})
WITH c LIMIT 100
WITH COLLECT(c) as cNodes
UNWIND cNodes as c1
MATCH (c1)-[r]->(c2)
WHERE c2 in cNodes
RETURN c1, TYPE(r) as rel, c2

正如其他人所提到的,不推薦不帶標簽的匹配,因為必須掃描所有節點,因此隨着db的大小增加,查詢將變得越來越慢。 如果可能,在初始匹配上使用標簽,如果標簽上有索引及其type屬性,則這可能是一個非常快速的查詢。

我找到的最快的方式是:

 MATCH (n:NodeName {param:"7"})
        with n
        skip 0
        limit 5
        MATCH n-[r]->(k)
        with n,k,r

你也可以減少執行時間,例如,如果不是n,k,r將使用n.data,r.data,k.data

這是在Neo4j 2.3上測試的

為此有一個 APOC function - apoc.algo.cover

MATCH (n)
WHERE n.type = "sometype"
WITH collect(id(n)) as nodes
CALL apoc.algo.cover(nodes)
YIELD rel
RETURN  startNode(rel), rel, endNode(rel);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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