2017-10-10 45 views
1

从我的搜索我没有找到一种方法来动态设置对象的属性,只有通过定义它硬编码(如下面的“详细”属性)Neo4j - Cypher - 建立对象属性是动态的,如类型(r)

这里是我的示例: Neo4j Graph或通过Neo4j Console

MATCH(p:Person)-[r]->(m:Movie) 
WITH { Person: p.name, 
     Detail: collect(r.roles) 
    } AS Result 
RETURN Result 

我的目标(还没有成型):

MATCH(p:Person)-[r]->(m:Movie) 
WITH { Person: p.name, 
     CASTED_FOR: // --> Only values(r.roles) for relationship "CASTED_FOR" needed here 
     ACTED_IN: // --> Only values(r.roles) for relationship "ACTED_IN" needed here 
    } AS Result 
RETURN Result 

I K现在我可以制作例如[r:CASTED_FOR]或WHERE Type(r)=“CASTED_FOR”,但我不喜欢有多个WITH和MATCH查询。

谢谢

回答

3

此查询使用Cypher支架的list comprehension结构做你想做什么:

MATCH (p:Person)-[r]->(:Movie) 
WITH p, COLLECT(r) AS rs 
RETURN { 
    Person: p.name, 
    CASTED_FOR: [x IN rs WHERE TYPE(x) = 'CASTED_FOR' | x.roles], 
    ACTED_IN: [x IN rs WHERE TYPE(x) = 'ACTED_IN' | x.roles] 
} AS Result 
+0

伟大的答案,谢谢 – Peter