在neo4j中创建/匹配包含和不包含公共根节点的树结构

在neo4j中创建/匹配包含和不包含公共根节点的树结构,neo4j,tree,cypher,Neo4j,Tree,Cypher,我试图重新创建一个树结构(在本例中是java包,但也可以是目录层次结构或其他任何东西),匹配公共起始节点,并在路径不同的地方发散。显然,相同的命名叶节点不是相同的节点 例如:a.b.c.d将变成(a)-(b)-(c)-(d)。另外,a.b.c将变成(a)-(b)-(c):相同的基础,因此是路径的一部分 我尝试了以下方法: unwind ['a.b.c.d', 'x.a.b.c'] as pkg with split(pkg, '.') as packages foreach (idx in

我试图重新创建一个树结构(在本例中是java包,但也可以是目录层次结构或其他任何东西),匹配公共起始节点,并在路径不同的地方发散。显然,相同的命名叶节点不是相同的节点

例如:
a.b.c.d
将变成
(a)-(b)-(c)-(d)
。另外,
a.b.c
将变成
(a)-(b)-(c)
:相同的基础,因此是路径的一部分

我尝试了以下方法:

unwind ['a.b.c.d', 'x.a.b.c'] as pkg 
with split(pkg, '.') as packages 
foreach (idx in range(0, size(packages) - 2) | 
  merge (pkg1:Package{name: packages[idx]}) 
  merge (pkg2:Package{name: packages[idx+1]}) 
  merge (pkg1)<-[:IN_PACKAGE]-(pkg2) 
) 

那么如何匹配常见的起始节点呢?

这里更好的方法是:每个包节点都包含完整的包名(除了它的子包)。这使得“a.b.c.d”包与“x.b.c.d”包不同

不幸的是,Neo4j没有很好的支持文本操作来分解各个级别的完整包。你需要APOC程序来完成这项工作,你需要跳过几个障碍才能到达这里

这个查询应该可以做到这一点

UNWIND ['a.b.c.d', 'a.b.c.e','x.b.c.d'] as pkg 
WITH pkg, split(pkg, '.') as packages
UNWIND range(1,size(packages)) as index
WITH packages[index - 1] as subpackage, apoc.text.join(packages[..index], '.') as myPkg, apoc.text.join(packages[..index - 1], '.') as parentPackage
WITH subpackage, myPkg, parentPackage
MERGE (package:Package{name:myPkg, subpackage:subpackage})
WITH package, parentPackage
WHERE parentPackage <> ''
MERGE (parent:Package{name:parentPackage})
MERGE (parent)<-[:IN_PACKAGE]-(package)
将['a.b.c.d'、'a.b.c.e'、'x.b.c.d']作为包装展开
使用包装,将(包装,“.”)拆分为包装
展开范围(1,尺寸(包装))作为索引
将packages[index-1]作为子包,apoc.text.join(packages[…index],“.”)作为myPkg,apoc.text.join(packages[…index-1],“.”)作为parentPackage
带子包、myPkg、parentPackage
合并(包:包{name:myPkg,subpackage:subpackage})
带包,带父包
其中parentPackage“”
合并(父:包{name:parentPackage})

我不知道你的问题是什么。
(x)-(a)-(b)-(c)-(d)
作为结果树有什么问题?此外,您的查询不会返回任何路径,那么您指的是什么路径?
UNWIND ['a.b.c.d', 'a.b.c.e','x.b.c.d'] as pkg 
WITH pkg, split(pkg, '.') as packages
UNWIND range(1,size(packages)) as index
WITH packages[index - 1] as subpackage, apoc.text.join(packages[..index], '.') as myPkg, apoc.text.join(packages[..index - 1], '.') as parentPackage
WITH subpackage, myPkg, parentPackage
MERGE (package:Package{name:myPkg, subpackage:subpackage})
WITH package, parentPackage
WHERE parentPackage <> ''
MERGE (parent:Package{name:parentPackage})
MERGE (parent)<-[:IN_PACKAGE]-(package)