2017-04-15 96 views
0

我試圖在收集節點時將節點的屬性與其關係的屬性組合起來。但我的嘗試似乎不工作...neo4j query - 無法組合節點和關係屬性

我的查詢如下所示:

MATCH (foo:Foo)-[rel:Rel]->() 
RETURN collect(properties(foo) + properties(rel)) as myCollection 

編輯:

我需要在不使用其他插件像APOC

的解決方案

謝謝

回答

1

Properties()返回一個地圖而不是一個集合,所以你不能以這種方式將它們與Cypher結合起來。

可以使用APOC Procedures到兩張地圖結合成一個:

MATCH (foo:Foo)-[rel:Rel]->() 
apoc.map.merge(properties(foo),properties(rel)) YIELD value 
RETURN collect(value) as props 

編輯

至於不使用插件的方法有兩種,我知道用地圖投影的,但他們伴隨着他們自己的複雜。

首先,如果你知道你想要得到的屬性,你可以明確地設置他們的屬性地圖使用地圖投影:

MATCH (foo:Foo)-[rel:Rel]->() 
RETURN foo {.*, relProp1:rel.prop1, relProp2:rel.prop2, relProp3:rel.prop3 ...} as props 

或者,您可以設置整個屬性映射,但它會是一個重要的價值,而不是一個真正的綜合地圖:

MATCH (foo:Foo)-[rel:Rel]->() 
RETURN foo {.*, relProps:properties(rel)} as props 
+0

我其實只想屬性組合成一個對象,像Object.assign(OBJ1,OBJ2,OBJ 3)在JavaScript。我認爲APOC沒有安裝默認情況下,這可悲的是不適合我。 –

+0

是的,'apoc.map.merge()'將節點和關係的屬性映射組合成一個對象。如果您的MATCH匹配多個對象(您的示例將匹配所有:Foo節點和所有:來自每個Foo節點的Rel關係),那麼末尾的collect()將最終爲您提供一組屬性映射對於每個:Foo /:Rel對。 – InverseFalcon

+0

至於APOC,安裝說明位於鏈接頁面上。基本上你下載了jar,把jar放到plugins文件夾中,然後重新啓動Neo4j。應該很快。 – InverseFalcon