[英]Neo4j cypher query collect in collect
我有一個問題:
start brand=node(62) match brand-[:CREATED_A]->(campaign:Campaign)<-->(node)
return DISTINCT brand,campaign,collect(node) ;
現在結果幾乎像我想的那樣回來了。 我缺少的一件事是我希望有以下層次結構:
品牌有很多廣告系列和廣告系列都有很多節點連接到它,因此廣告系列中的節點類型。
現在,廣告系列將多次返回到正在返回的每個廣告系列。
我提供了一個說明解決方案的Neo4j Gist 。 簡而言之,它使用文字地圖來格式化數據,並使用兩個收集來確保品牌不會多次出現。
MATCH
(brand:Brand)-[:CREATED_A]->(campaign:Campaign)<-->(node)
WITH
brand,
{
campaign : campaign,
nodes : COLLECT(node)
} AS campaigns
WITH
{
brand : brand,
campaigns : COLLECT(campaigns)
} AS brands
RETURN brands
這使得品牌出現一次,您可以獲得一個很好的輸出格式。
Cypher是一種非常強大的語言。 如果您知道要從節點獲取哪些屬性,您甚至可以返回類似json的輸出,該輸出也維護您在圖形中實際建模的結構,您可以執行以下操作:
MATCH (brand:Brand)-[:CREATED_A]->(campaign:Campaign)<-->(node)
WITH
brand,
campaign as campaign,
COLLECT({
property1 : node.property1,
property2 : node.property2
}) as nodes
RETURN
{
name : brand.name,
logoUrl : brand.logoUrl,
campaigns : COLLECT({
name : campaign.name,
timestamp : campaign.timestamp,
nodes : nodes
})
} as brands
這將輸出一個json結構,例如:
[
{
name : "my name",
logoUrl : "http://www...",
campaigns : [
{
name : "my campaign name",
timestamp : 1484172044462,
nodes : [
{
property1 : "property1",
property2 : "property2"
}
]
}
]
}
]
這實際上很好地反映了你的圖形模型。
此外,由於您沒有進行RETURN COLLECT(...),因此您可以迭代Record結果,而不是獲取第一個(也是唯一一個)記錄並將所有行放入其中。 當您處於嵌入式服務器之類的情況時,這可能是一種方便的方法,您可以在其中實際流式傳輸結果數據,而不是一次性檢索它。
即使您沒有任何集合(例如,一個廣告系列只有一個節點),並且路徑越來越深,這種方法也能很好地運行。 但是,當您的模型是樹(或更糟的是圖表)時,您可能會遇到挑戰。
你可以在這個好主旨中找到更多細節: https : //gist.github.com/rherschke/9269173
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.