2015-01-14 119 views
1

我已經繼承了一個代碼庫,它使用遞歸Neo4J v1.9.4密碼從XML文件中提取數據並將它們'按原樣'存儲在Neo4J數據庫中。Neo4J - 聚合數據

我需要使用Cyphers從這個Neo4J數據庫中提取和聚合數據,我有一個問題涉及到來自特定領域的數據聚合。

下面的XML數據結構提供了什麼是存儲在Neo4j的數據庫的精確表示:

<description type="1"> 
<narrative> 
General activity description text. Long description of the activity with no particular structure. 
</narrative> 
<narrative xml:lang="fr"> 
Activité générale du texte de description. Longue description de l'activité sans structure particulière. 
</narrative> 
</description> 
<description type="2"> 
<narrative> 
Objectives for the activity, for example from a logical framework. 
</narrative> 
<narrative xml:lang="fr"> 
Objectifs de l'activité, par exemple à partir d'un cadre logique. 
</narrative> 
</description> 
<description type="3"> 
<narrative> 
Statement of groups targeted to benefit from the activity. 
</narrative> 
<narrative xml:lang="fr"> 
Déclaration de groupes ciblés pour bénéficier de l'activité. 
</narrative> 
</description> 

我想創建一個暗號,將返回三個英語語言敘述標籤的內容,即作爲一個組合值保存 - 返回的數據應該如下所示:

一般活動描述文本。對活動沒有特定結構的詳細描述。活動的目標,例如來自邏輯框架。旨在從活動中受益的小組聲明。

更進一步的複雜性是,Cypher也將不得不應對少於3個描述標籤的情況。邊緣的情況下的例子(純粹數據結構而言,它可能是相當常見的)將是如下:

<description> 
<narrative> 
General activity description text. Long description of the activity with no particular structure. 
</narrative> 
<narrative xml:lang="fr"> 
Activité générale du texte de description. Longue description de l'activité sans structure particulière. 
</narrative> 
</description> 

*注意當僅存在一個描述標籤類型= 1個屬性不是manditory。

從這個XML數據結構中,Cypher的輸出需要是:一般活動描述文本。沒有特別的活動的詳細描述

最後要說明的一點是,英語敘述XML標籤可能包含或不包含xml:lang =「en」屬性。

我想從描述結構中出現的缺少語言屬性或具有值xml:lang =「en」的任何敘述標記中提取內容。

目前我們對於Neo4J 1.9.4版略有困難,因此升級數據庫以從產品的更高版本獲取功能並不是真正的選擇。

Cypher支架如下:

START n=node:entities(type="iati-activity") 
MATCH n-[:`participating-org`]-o, 
     n-[:`reporting-org`]-ro, 
     n-[:`title`]-ti, 
     n-[:transaction]-t-[:`transaction-type`]-tt, 
     n-[?:description]-d, 
     t-[:value]-v, 
     n-[:`activity-status`]-status, 
     t-[:`provider-org`]-po, 
     n-[?:`recipient-country`]-country, 
     n-[?:`recipient-region`]-region 
WHERE o.role = 1 
     AND HAS(o.ref) AND o.ref IN ["GB","GB-1"]  
     AND tt.code = 1 
     AND HAS(po.`provider-activity-id`) 
RETURN n.`iati-identifier`?   as funded, 
     ro.`narrative`    as reporting, 
     ti.`narrative`   as title, 
     COALESCE(d.`narrative`?,"") as description, 
     po.`provider-activity-id`  as funding, 
     COALESCE(v.currency?, "GBP") as currency, 
     SUM(v.value)     as funds, 
     status.code?    as status, 
     COALESCE(country.code?,region.code?,"") as recipient 

這暗號返回,其中每三個描述分配給受援國和因此有六行返回的數據的數據集。

|資助|報告|標題|描述|資金|貨幣|基金|狀態|收件人|

| AA-AAA-123456789-ABC123 | Nom de l'organisme | Títulode la actividad | Déclarationde groupescibléspourbénéficierde l'activité。 | GB-1-202035 | EUR | 2000 | 2 | AG |

| AA-AAA-123456789-ABC123 | Nom de l'organisme | Títulode la actividad | Déclarationde groupescibléspourbénéficierde l'activité。| GB-1-202035 | EUR | 2000 | 2 | AF |

| AA-AAA-123456789-ABC123 |組織名稱| Títulode la actividad |說明文字的一般活動。詳細描述沒有特定結構的活動。 | GB-1-202035 | EUR | 2000 | 2 | AG |

| AA-AAA-123456789-ABC123 |組織名稱| Títulode la actividad |活動的目標,例如來自邏輯框架。 | GB-1-202035 | EUR | 2000 | 2 | AG |

| AA-AAA-123456789-ABC123 |組織名稱| Títulode la actividad |說明文字的一般活動。詳細描述沒有特定結構的活動。 | GB-1-202035 | EUR | 2000 | 2 | AF |

| AA-AAA-123456789-ABC123 |組織名稱| Títulode la actividad |活動的目標,例如來自邏輯框架。 | GB-1-202035 | EUR | 2000 | 2 | AF |

我想的聯軍描述(敘述性說明包含三個加在一起)駁返回的數據受援國的兩行。預先感謝您的幫助任何要可靠的提供。

更新:我已經過氣可靠創建以下的Cypher魁彙總數據分成兩行然而,聚合描述字段包含重複的值(即所有六個說明具備的,聚合成的聚合描述字段我只想看到三個獨特的聚合描述)。

START n=node:entities(type="iati-activity") 
MATCH n-[:`participating-org`]-o, 
     n-[:`reporting-org`]-ro, 
     n-[:`title`]-ti, 
     n-[:transaction]-t-[:`transaction-type`]-tt, 
     n-[?:description]-d, 
     t-[:value]-v, 
     n-[:`activity-status`]-status, 
     t-[:`provider-org`]-po, 
     n-[?:`recipient-country`]-country, 
     n-[?:`recipient-region`]-region 
WHERE o.role = 1 
     AND HAS(o.ref) AND o.ref IN ["GB","GB-1"]  
     AND tt.code = 1 
     AND HAS(po.`provider-activity-id`) 
WITH n as n, ro as ro, ti as ti, po as po, status as status, v as v, 
     country as country, region as region, COALESCE(d.`narrative`, "") as someText   
RETURN n.`iati-identifier`?   as funded, 
     ro.`narrative`    as reporting, 
     ti.`narrative`   as title, 
     REDUCE(accum = "", txt IN collect(someText) | accum + txt + " ") AS AggregatedDescription, 
     po.`provider-activity-id`  as funding, 
     COALESCE(v.currency?, "GBP") as currency, 
     SUM(v.value)     as funds, 
     status.code?    as status, 
     COALESCE(country.code?,region.code?,"") as recipient 

輸出數據

|資助|報告|標題| AggregatedDescription |資金|貨幣|基金|狀態|收件人|

| AA-AAA-123456789-ABC123 |組織名稱| Títulode la actividad |宣佈目標羣體從活動中受益。活動的目標,例如來自邏輯框架。說明文字的一般活動。詳細描述沒有特定結構的活動。宣佈目標羣體從活動中受益。活動的目標,例如來自邏輯框架。說明文字的一般活動。詳細描述沒有特定結構的活動。 | GB-1-202035 | EUR | 6000 | 2 | AG |

| AA-AAA-123456789-ABC123 |組織名稱| Títulode la actividad |宣佈目標羣體從活動中受益。活動的目標,例如來自邏輯框架。說明文字的一般活動。詳細描述沒有特定結構的活動。宣佈目標羣體從活動中受益。活動的目標,例如來自邏輯框架。說明文字的一般活動。詳細描述沒有特定結構的活動。 | GB-1-202035 | EUR | 6000 | 2 | AF |

我曾試圖一起使用DISTINCT命令和命令,以便凝聚這說明只有單排凝集的目標並沒有工作。

+0

你說你已經繼承了一個代碼庫,它將XML中的數據提取到Neo4J中。你的查詢聽起來完全可行,但你需要向我們展示一下你的neo4j數據是什麼樣子的例子。我們無法幫助您對原始XML進行密碼查詢,因爲它取決於數據在neo4j中的樣子。那麼對於那個XML例子,你可以發佈一個等效的neo4j數據示例嗎?或者,您是否問*如何將數據從XML中提取到neo4j中? – FrobberOfBits

+0

你好,感謝您的評論。我想澄清一下,我在問如何將所有我用粗體突出顯示的文本放到名爲description的Neo4J數據塊中的字段中。我已經陷入了where子句中需要放置的東西,XML源數據變得更加複雜,我們使用的COALESCE函數不適合用途(它僅用於緩解空值)。對不起,我無法提供更多詳細信息查詢保存在我的桌面工作機上,我在英國,如果您需要更多信息,我將在明天發佈查詢。 – CanCanPelican

+0

您需要發佈您正在使用的密碼,或者有關您如何進行XML數據提取的內容。現在,您只提供了XML細節。這告訴我們你開始的是什麼,但不是你在做什麼。儘管你的問題聽起來可以回答更多的信息。 – FrobberOfBits

回答

0

好了,你的第一個問題:

我想創建一個暗號,將返回 三個英文語言敘述的標籤,所舉行的 描述標籤中的內容,作爲一個組合值 - 返回的數據應該是 看起來像這樣:

常規活動描述文本。沒有特別結構的活動 的詳細描述。該活動的目標,例如邏輯框架中的 。針對受益於 活動的小組聲明。

據我所知,這可以歸結爲如何連接多個字符串值;你有三個「說明」,並希望他們合併成一個字符串:

START n=node:entities(type="iati-activity") 
MATCH n-[?:description]-d 
WITH coalesce(d.narrative, "") as someText 
RETURN REDUCE(accum = "", txt IN collect(someText) | accum + txt + " ") AS joinedText; 

因此,我們合併文本擺脫缺失值和空值,然後REDUCE,基本上是做一個字符串加入,與" "作爲分隔符並返回結果。

One final point to note is that the english language narrative XML tags may or may not contain the xml:lang="en" attribute. 

行,所以你的更廣泛的問題 - 你可能想在某些情況下,語言來過濾,這只是一個WHERE條款引用d.lang我想,雖然我不能從你的暗號告訴你如何是在您的neo4j中存儲來自XML的lang屬性。

在訂購時,根據您提供的內容,我無法確定您是否以任何方式將XML標籤的原始順序存儲在密碼中。您當然可以訂購查詢的結果,所以如果您的neo4j數據中有一些保留原始XML排序的序列號,這是可行的,但由於您沒有提供足夠的詳細信息,因此我無法向您提供該查詢。

+0

非常感謝您的幫助,Cypher提供完美的工作。實際上,我將原來的Cypher分成兩部分,這樣我就可以得到每個'iati-identifier'的彙總描述,並使用Scala代碼將結果合併到需要的最終對象中。 – CanCanPelican

+0

我想連接字符串值或「通過標記連接字符串」應該是某種配方,這是一個相當普遍的需要。很高興這有助於。 – FrobberOfBits