簡體   English   中英

Neo4j cypher查詢收集在收集中

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

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