2017-03-07 21 views
7

假設有2個標籤P和M.M具有名稱爲M1,M2,M3..M10的節點。我需要將P的50個節點與M的每個節點相關聯。也沒有標籤P的節點應該與節點M有2個關聯。如果使用密碼不存在,則在節點之間創建關聯

這是我可以想到的密碼查詢,但似乎並不工作。

MATCH (u:P), (r:M{Name:'M1'}),(s:M) 
where not (s)-[:OWNS]->(u) 
with u limit 50 
CREATE (r)-[:OWNS]->(u); 

這樣我就會運行M的所有10個節點。任何幫助糾正查詢的讚賞。

+0

是否存在:P和:M節點之間的OWNS關係,還是這個查詢將成爲第一個進行這些關係的人? – InverseFalcon

+0

這是第一個關係。 –

回答

3

這對我有用。

MATCH (u:P), (r:M{Name:'M1'}),(s:M) 
where not (s)-[:OWNS]->(u) 
with u,r limit 50 
CREATE (r)-[:OWNS]->(u); 

感謝托馬斯提及對u和r的限制。

5

您可以使用apoc.periodic。*庫進行批處理。在documentation

call apoc.periodic.commit(" 
MATCH (u:P), (r:M{Name:'M1'}),(s:M) where not (s)-[:OWNS]->(u) 
with u,r limit {limit} 
CREATE (r)-[:OWNS]->(u) 
RETURN count(*) 
",{limit:10000}) 

更多信息如果總是會有隻是一個(r)-[:OWNS]->(u)關係,我會改變我的第一場比賽,包括

call apoc.periodic.commit(" 
MATCH (u:P), (r:M{Name:'M1'}),(s:M) where not (s)-[:OWNS]->(u) and not (r)-[:OWNS]->(u) 
with u,r limit {limit} 
CREATE (r)-[:OWNS]->(u) 
RETURN count(*) 
",{limit:10000}) 

所以沒有辦法的程序會陷入一個循環

4

該查詢應該是一個快速且易於理解的查詢。這是快,因爲它避免了Cartesian products

MATCH (u:P) 
WHERE not (:M)-[:OWNS]->(u) 
WITH u LIMIT 50 
MATCH (r:M {Name:'M1'}) 
CREATE (r)-[:OWNS]->(u); 

它首先匹配50個無主P節點。然後,它找到應該是「所有者」的節點M,並創建它與每個節點之間的關係OWNS

爲了使這個查詢更快,你可以先創建:M(Name)一個索引,使所屬M節點可以很快找到(無掃描所有M節點):

CREATE INDEX ON :M(Name); 
1

我想連接的一種方式所有10個節點:M在一個查詢

MATCH (m:M) 
WITH collect(m) as nodes 
UNWIND nodes as node 
MATCH (p:P) where not()-[:OWNS]->(p) 
WITH node,p limit 50 
CREATE (node)-[:OWNS]->(p) 

雖然我真的不知道,如果我們需要收集和放鬆,可能只是它簡化爲:

MATCH (m:M) 
MATCH (p:P) where not()-[:OWNS]->(p) 
WITH m,p limit 50 
CREATE (node)-[:OWNS]->(p) 
相關問題