将增量属性添加到节点链中的节点

时间:2017-12-14 09:50:02

标签: neo4j cypher

我有一个节点链,我想为每个节点添加一个属性"DtaID",并且值应该在链中增加。有没有办法用Cypher做到这一点?

1 个答案:

答案 0 :(得分:1)

我认为你有这种格式的节点链:

create (:Node)-[:LINK]->(:Node)-[:LINK]->(:Node)-[:LINK]->(:Node)-[:LINK]->(:Node)-[:LINK]->(:Node)-[:LINK]->(:Node)

然后我使用了这个Cypher:

// Get the path between the start and end nodes, including both
MATCH p = (start:Node)-[:LINK*]->(end:Node)
WHERE NOT (end)-[:LINK]->() AND NOT ()-[:LINK]->(start)
// extract the nodes of p and calc an array of indexes to 
// access each node in the array of nodes called `nodes`.
WITH nodes(p) as nodes, range(0, size(nodes(p))) AS indexes
// unwind indexes as index...
UNWIND indexes AS index
// set the value of `DtaID` property of each nodes to the index value.
// That is: the node 0 will have `DtaID` equal to 0.
// I'm assuming that you need an increment by one. If you need a
// different increment you can do calculations here. For example:
// SET (nodes[index]).DtaID = index * 10 to increment by 10.
SET (nodes[index]).DtaID = index

结果:

╒═══════════╕
│"n"        │
╞═══════════╡
│{"DtaID":0}│
├───────────┤
│{"DtaID":1}│
├───────────┤
│{"DtaID":2}│
├───────────┤
│{"DtaID":3}│
├───────────┤
│{"DtaID":4}│
├───────────┤
│{"DtaID":5}│
├───────────┤
│{"DtaID":6}│
└───────────┘

如果需要使用第一个节点的DtaID值作为基值,可以将第一个节点传递给WITH子句并用于计算。

MATCH p = (start:Node)-[:LINK*]->(end:Node)
WHERE NOT (end)-[:LINK]->() AND NOT ()-[:LINK]->(start)
WITH start, nodes(p) as nodes, range(0, size(nodes(p))) AS indexes
UNWIND indexes AS index
SET (nodes[index]).DtaID = start.DtaID + index