2015-05-01 56 views
9

我的目標是訪問並改變密碼查詢中的節點的屬性,其中要訪問和突變的屬性的名稱是未知字符串值。如何通過Cypher中的屬性名稱字符串訪問和更改節點屬性值?

例如,考慮一個命令:

查找含有兩個屬性,使得所述第一屬性的名稱是小寫和後者的名稱的所有節點是大寫表示的前者。 Then,將小寫字符串名稱的屬性值傳遞給大寫名稱的屬性值。

的特定情況下是很容易:

MATCH (node) 
WHERE has(node.age) AND has(node.AGE) AND node.age <> node.AGE 
SET node.AGE = node.age 
RETURN node; 

但我似乎無法找到一種方法來實現單個請求的一般情況。

具體來說,我不能:

  1. 訪問節點的一個字符串和值的屬性
  2. 變異節點的屬性用於字符串和值

爲了清楚起見,我將包括我處理一般情況的嘗試。如果我未能修改節點的屬性,我可以爲一個命令生成密碼,以便在後續事務中執行該命令時完成我的最終目標。

MERGE (justToMakeSureOneExists { age: 14, AGE : 140 }) WITH justToMakeSureOneExists 
MATCH (node) 
WHERE ANY (kx IN keys(node) WHERE kx = LOWER(kx) AND ANY (ky in keys(node) WHERE ky = UPPER(kx))) 
REMOVE node.name_conflicts // make sure results are current 
FOREACH(kx in keys(node) | 
    SET node.name_conflicts 
     = COALESCE(node.name_conflicts,[]) 
     + CASE kx 
      WHEN lower(kx) 
      THEN [] 
       + CASE WHEN any (ky in keys(node) WHERE ky = upper(kx)) 
        THEN ['match (node) where id(node) = ' + id(node)+ ' and node.' + upper(kx) + ' <> node.' + kx + ' set node.' + upper(kx) + ' = node.' + kx + ' return node;'] 
        ELSE [] END 
      ELSE [] 
      END) 
RETURN node,keys(node) 

有感:好像變異按屬性名稱的節點屬性將是一個非常常見的需求的能力,但對於功能缺乏明顯的支持,使我相信該功能是故意省略?如果此功能確實不受支持,是否有任何文檔解釋爲什麼以及該方法與Neo/Cypher中推薦的處理方式之間是否存在衝突?

回答

0

看來,在Neo4j 2.3.0中,名爲「動態屬性」的Cypher中添加了所需的語言功能。從版本2.3.0式Cypher支架文檔聲明的語法如下基團作爲有效暗號表達式:

動態屬性:n["prop"]rel[n.city + n.zip]map[coll[0]]

此功能記錄爲2.3.0,但缺席previous version (2.2.9)

謝謝Neo4j團隊!

3

有關Cypher動態屬性訪問的改進支持的討論正在進行中。我非常有信心,我們將來會看到對此的支持,但我無法對目標版本和日期發表評論。

作爲解決方法,我建議將其實施到unmanaged extension

+0

是否可以使用非託管擴展來擴展默認密碼處理? – smartcaveman

+0

否。非託管擴展暴露爲新的REST端點。 –

+0

這就是我的想法......那麼當你說要通過屬性名稱實現變異屬性作爲非託管擴展時,你究竟意味着什麼? (REST api支持開箱即用) – smartcaveman

相關問題