2014-10-10 90 views
1

我剛剛將英文維基百科導入到Neo4j中,並且正在玩耍。我開始查找鏈接到頁面「柏林」的頁面Neo4j:如何限制子查詢

MATCH p=(p1:Page {title:"Berlin"})<-[*1..1]-(otherPage) 
WITH nodes(p) as neighbors 
LIMIT 500 
RETURN DISTINCT neighbors 

工作得很好。接下來我想實現的是展示第二級關係。爲了能夠正確顯示它們,我想限制第一度關係節點的數量爲20,然後查詢下一級關係。

如何實現這一目標?

回答

2

我不知道維基百科模型,但我假設有很多不同的關係類型,這就是爲什麼 - [* 1..1] - ,我認爲這類似於 - [] - 甚至 - 。我懷疑它有什麼嚴重的影響。

您可以收集第一級匹配,並使用WITH WITH LIMIT將其限制爲20。然後,您可以使用這些(其他頁面)作爲起點執行第二次匹配。

MATCH (p1:Page {title:"Berlin"})<-[*1..1]-(otherPage:Page) 
WITH p1, otherPage 
LIMIT 20 
MATCH (otherPage)<-[*1..1]-(secondDegree:Page) 
WHERE secondDegree <> p1 
WITH otherPage, secondDegree 
LIMIT 500 
RETURN otherPage, COLLECT(secondDegree) 

有很多方法可以返回數據,這只是返回與後續匹配數組的第一次匹配。

如果關係的唯一類型是:Link和你想保留的起始節點,那麼你可以更改查詢到這一點:

MATCH (p1:Page {title:"Berlin"})<-[:Link]-(otherPage:Page) 
WITH p1, otherPage 
LIMIT 20 
MATCH (otherPage)<-[:Link]-(secondDegree:Page) 
WHERE secondDegree <> p1 
WITH p1, otherPage, secondDegree 
LIMIT 500 
RETURN p1, otherPage, COLLECT(secondDegree) 
+0

感謝。結構非常簡單(在我的模型中)。這只是一個「:鏈接」類型的關係。你的解決方案似乎只能返回直接的鄰居和二級鄰居。但是留下了第一個開始節點,即柏林。有沒有辦法改變它? – 2014-10-10 17:40:44