我已經繼承了一個代碼庫,它使用遞歸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命令和命令,以便凝聚這說明只有單排凝集的目標並沒有工作。
你說你已經繼承了一個代碼庫,它將XML中的數據提取到Neo4J中。你的查詢聽起來完全可行,但你需要向我們展示一下你的neo4j數據是什麼樣子的例子。我們無法幫助您對原始XML進行密碼查詢,因爲它取決於數據在neo4j中的樣子。那麼對於那個XML例子,你可以發佈一個等效的neo4j數據示例嗎?或者,您是否問*如何將數據從XML中提取到neo4j中? – FrobberOfBits
你好,感謝您的評論。我想澄清一下,我在問如何將所有我用粗體突出顯示的文本放到名爲description的Neo4J數據塊中的字段中。我已經陷入了where子句中需要放置的東西,XML源數據變得更加複雜,我們使用的COALESCE函數不適合用途(它僅用於緩解空值)。對不起,我無法提供更多詳細信息查詢保存在我的桌面工作機上,我在英國,如果您需要更多信息,我將在明天發佈查詢。 – CanCanPelican
您需要發佈您正在使用的密碼,或者有關您如何進行XML數據提取的內容。現在,您只提供了XML細節。這告訴我們你開始的是什麼,但不是你在做什麼。儘管你的問題聽起來可以回答更多的信息。 – FrobberOfBits