如何查询具有可变长度关系的Neo4j N深度级别以及每个级别上的过滤器
我是Neo4j的新手,我正在尝试构建一个工具,允许用户在UI上指定他们想要查询Neo4j的节点路径。对于路径中的每个节点,它们可以指定节点的特定属性,通常不关心关系类型/属性。关系的长度需要可变,因为它们的典型用例是它们有一个开始节点,并且它们想知道它是否到达某个结束节点,而不关心(所有)开始和结束之间的中间节点 用户在从UI构建路径时的一些限制是,它不能有循环、不能有具有多个子节点的节点以及不能有多个传入边缘的节点。这只是从他们的角度强制执行的,而不是在查询本身中 我遇到的问题是能够在路径的每个级别上指定过滤,而不会出现奇怪的行为 我已经尝试了很多Cypher查询的变体,比如将路径分解为多个匹配语句、修补关系以及我能想到的任何其他内容 这里是一个样本密码转储的要点 这个查询提供了我试图获取的路径,但是它没有在n_-four上指定名称或类型如何查询具有可变长度关系的Neo4j N深度级别以及每个级别上的过滤器,neo4j,cypher,Neo4j,Cypher,我是Neo4j的新手,我正在尝试构建一个工具,允许用户在UI上指定他们想要查询Neo4j的节点路径。对于路径中的每个节点,它们可以指定节点的特定属性,通常不关心关系类型/属性。关系的长度需要可变,因为它们的典型用例是它们有一个开始节点,并且它们想知道它是否到达某个结束节点,而不关心(所有)开始和结束之间的中间节点 用户在从UI构建路径时的一些限制是,它不能有循环、不能有具有多个子节点的节点以及不能有多个传入边缘的节点。这只是从他们的角度强制执行的,而不是在查询本身中 我遇到的问题是能够在路径的每
MATCH path = (n_one)-[*0..]->(n_two)-[*0..]->(n_three)-[*0..]->(n_four)
WHERE n_one.type IN ["JCL_JOB"]
AND n_two.type IN ["JCL_PROC"]
AND n_three.name IN ["INPA", "OUTA", "PRGA"]
AND n_three.type IN ["RESOURCE_FILE", "COBOL_PROGRAM"]
RETURN path
这个查询是我想处理的,但是它忽略了第三级的leaf,我很难理解
MATCH path = (n_one)-[*0..]->(n_two)-[*0..]->(n_three)-[*0..]->(n_four)
WHERE n_one.type IN ["JCL_JOB"]
AND n_two.type IN ["JCL_PROC"]
AND n_three.name IN ["INPA", "OUTA", "PRGA"]
AND n_three.type IN ["RESOURCE_FILE", "COBOL_PROGRAM"]
AND n_four.name IN ["TAB1", "TAB2", "COPYA"]
AND n_four.type IN ["RESOURCE_TABLE", "COBOL_COPYBOOK"]
RETURN path
我注意到,当我在查询中“…返回n_-four”时,它也包括第三级的节点。这种行为是由于在
匹配模式中使用[*0..]
造成的(可能不适当)
供参考:
[*0..]
匹配0个或多个关系。例如,(a)-[*0..]>(b)
将成功,即使a
和b
是同一个节点(并且该节点与自身没有关系)
- 默认下限为1。所以
[*]
相当于[*]
和[*1..]
您的两个查询使用相同的MATCH
模式,以..->(n_三)-[*0..]->(n_四)
结尾
- 第一个查询没有指定任何
,其中测试n_-four
,因此查询可以自由返回路径,其中n_-four
和n_-four
是同一节点。这就是为什么查询能够返回2个额外节点的原因
- 第二个查询指定了
WHERE
测试nfour
,这使得nfour
和nfour
不可能是同一个节点。查询现在更加挑剔,因此不再返回这两个额外的节点
您不应该使用[*0..]
,除非您确定要选择性地匹配0关系。它还可能增加不必要的开销。而且,正如您现在所知道的,它也使查询更难理解。这种行为是由于您在匹配模式中使用[*0..]
造成的(可能不适当)
供参考:
[*0..]
匹配0个或多个关系。例如,(a)-[*0..]>(b)
将成功,即使a
和b
是同一个节点(并且该节点与自身没有关系)
- 默认下限为1。所以
[*]
相当于[*]
和[*1..]
您的两个查询使用相同的MATCH
模式,以..->(n_三)-[*0..]->(n_四)
结尾
- 第一个查询没有指定任何
,其中测试n_-four
,因此查询可以自由返回路径,其中n_-four
和n_-four
是同一节点。这就是为什么查询能够返回2个额外节点的原因
- 第二个查询指定了
WHERE
测试nfour
,这使得nfour
和nfour
不可能是同一个节点。查询现在更加挑剔,因此不再返回这两个额外的节点
您不应该使用[*0..]
,除非您确定要选择性地匹配0关系。它还可能增加不必要的开销。而且,正如您现在所知,这也使查询更难理解。您的查询似乎与声明的限制无关。一般来说,不清楚您想做什么。限制是在用户端构建一个图表来表示他们希望看到的调用链关系,而不是查询本身。我想做的是生成一个长度任意的查询->…->子节点。在每个子级,我可以指定节点属性的过滤器。您可以提供密码查询来创建数据以演示问题吗?我更新了帖子,其中包含一个指向示例数据库密码转储的要点链接,该示例数据库演示了我在查询中遇到的问题。您的查询似乎与所述问题无关限制。一般来说,不清楚您想做什么。限制是在用户端构建一个图表来表示他们希望看到的调用链关系,而不是查询本身。我想做的是生成一个长度任意的查询->…->子节点。在每个子级,我可以在节点属性上指定过滤器。您可以提供密码查询来创建数据以演示问题吗?我用一个指向示例数据库密码转储的要点链接更新了帖子,该示例数据库演示了我在查询中遇到的问题。