[英]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.