我想把Python包的模块表示为neo4j图中的节点。我得到如下输入,如果模块还没有被包含,我必须更新图。假设我的输入看起来像这样:
a.b.c.d
a.b.c.e
a
a.b.c
a.b
字符串
如果a.b.c
已经存在,我不想在遇到a.b.c.d
时重新创建这些节点。我只想创建一个名为d
的新节点并将其连接到c
。同样,如果我得到a.b.c
,而这些节点都不存在,然后我想创建所有的节点,并相应地连接它们。我的真实的输入可以有任意数量的节点,所以我想要一个可以处理任意路径长度的密码查询。
我是新来的。这是我第一次尝试。
MERGE p=(module:Module {name: $module_name})
WITH p, module
MATCH (package:Module)-[:contains*]->(module)
WHERE [x in nodes(p) | x.name] = $module_path
型
然而,Cypher给了我以下错误:
查询无法以MATCH结束
我也试过这个:
MERGE p=(:Module)-[:contains*]->(:Module)
WHERE [x in nodes(p) | x.name] = $module_path
型
但是Cypher抱怨WHERE
的存在。
请注意,我使用neo4j Python库来运行这个查询,我传入了这样的参数:{"module_path":["a","b","c"], "module_name":"c"}
。如果有更好的方法,我很乐意以不同的方式来参数化我的查询,但我不认为这是我错误的根源。
我用的是neo4j 5.12
社区版。
2条答案
按热度按时间kqqjbcuj1#
您可以使用纯Cypher方法,如下所示:
字符串
你可以用问题中的数据来测试这是如何工作的:
型

结果如下:
5cg8jx4n2#
它可以通过以下查询实现(添加了注解)
字符串
它产生这样的图形
的数据
稍后,如果您尝试对已经存在的模块路径执行相同的操作,它将不会执行任何操作,例如,在执行上述操作之后,以下查询将不会创建任何内容
型
的