繁体   English   中英

将阵列与Cypher(Neo4j)组合

[英]Combine array with Cypher (Neo4j)

当我有一个看起来像这样的字符串时:

"app-server/src/test/java/de/something/"

我将如何获得任何可能的组合,例如:

app-server/, app-server/src, app-server/src/test, ....

我显然可以用'/'分割它,然后有一个数组的部分。 我也可以手动添加所有这些内容,然后过滤null

...
WITH split(package.path,'/')[..size(split(package.path,'/'))-1]
WITH pathParts,
pathParts[0] AS p01,
pathParts[0] + '/' + pathParts[1] AS p02,
pathParts[0] + '/' + pathParts[1] + '/' + pathParts[2] AS p03,
...

替代:

WITH pathParts[0] AS p01,
reduce(s = pathParts[0], x IN pathParts[1..2] | s + '/' + x) + '/' AS p02,
reduce(s = pathParts[0], x IN pathParts[1..3] | s + '/' + x) + '/' AS p03,
reduce(s = pathParts[0], x IN pathParts[1..4] | s + '/' + x) + '/' AS p04,
...

但是,这些都是可怕的解决方案。


我还想从所有这些方面创建父子关系:

(childPackage:Package)-[:HAS_PARENT]->(parentPackage:Package)

例如(app-server/src)-[:HAS_PARENT]->(app-server/)

有必要拆分字符串,从数组中删除空元素,并在连接所有先前元素的同时遍历每个元素:

WITH "app-server/src/test/java/de/something/" AS path
WITH FILTER(p in SPLIT(path, "/") WHERE SIZE(p) > 0) AS pathParts
UNWIND RANGE(0, SIZE(pathParts)-1) AS i
RETURN REDUCE(acc = "", p IN pathParts[0..i+1] | acc + p + '/') AS pathPart

而且,第二遍将它们链接起来也不成问题:

WITH "app-server/src/test/java/de/something/" AS path
WITH FILTER(p in SPLIT(path, "/") WHERE SIZE(p) > 0) AS pathParts
UNWIND RANGE(0, SIZE(pathParts)-1) AS i
WITH collect(REDUCE(acc = "", p IN pathParts[0..i+1] | acc + p + '/')) AS pathParts

UNWIND RANGE(1, SIZE(pathParts)-1) AS i
  MERGE (P1:Package {path: pathParts[i-1]})
  MERGE (P2:Package {path: pathParts[i]})
  MERGE (P2)-[r:hasParent]->(P1)
RETURN P1, r, P2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM