Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何查询具有可变长度关系的Neo4j N深度级别以及每个级别上的过滤器_Neo4j_Cypher - Fatal编程技术网

如何查询具有可变长度关系的Neo4j N深度级别以及每个级别上的过滤器

如何查询具有可变长度关系的Neo4j N深度级别以及每个级别上的过滤器,neo4j,cypher,Neo4j,Cypher,我是Neo4j的新手,我正在尝试构建一个工具,允许用户在UI上指定他们想要查询Neo4j的节点路径。对于路径中的每个节点,它们可以指定节点的特定属性,通常不关心关系类型/属性。关系的长度需要可变,因为它们的典型用例是它们有一个开始节点,并且它们想知道它是否到达某个结束节点,而不关心(所有)开始和结束之间的中间节点 用户在从UI构建路径时的一些限制是,它不能有循环、不能有具有多个子节点的节点以及不能有多个传入边缘的节点。这只是从他们的角度强制执行的,而不是在查询本身中 我遇到的问题是能够在路径的每

我是Neo4j的新手,我正在尝试构建一个工具,允许用户在UI上指定他们想要查询Neo4j的节点路径。对于路径中的每个节点,它们可以指定节点的特定属性,通常不关心关系类型/属性。关系的长度需要可变,因为它们的典型用例是它们有一个开始节点,并且它们想知道它是否到达某个结束节点,而不关心(所有)开始和结束之间的中间节点

用户在从UI构建路径时的一些限制是,它不能有循环、不能有具有多个子节点的节点以及不能有多个传入边缘的节点。这只是从他们的角度强制执行的,而不是在查询本身中

我遇到的问题是能够在路径的每个级别上指定过滤,而不会出现奇怪的行为

我已经尝试了很多Cypher查询的变体,比如将路径分解为多个匹配语句、修补关系以及我能想到的任何其他内容

这里是一个样本密码转储的要点

这个查询提供了我试图获取的路径,但是它没有在n_-four上指定名称或类型

    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关系。它还可能增加不必要的开销。而且,正如您现在所知,这也使查询更难理解。

您的查询似乎与声明的限制无关。一般来说,不清楚您想做什么。限制是在用户端构建一个图表来表示他们希望看到的调用链关系,而不是查询本身。我想做的是生成一个长度任意的查询->…->子节点。在每个子级,我可以指定节点属性的过滤器。您可以提供密码查询来创建数据以演示问题吗?我更新了帖子,其中包含一个指向示例数据库密码转储的要点链接,该示例数据库演示了我在查询中遇到的问题。您的查询似乎与所述问题无关限制。一般来说,不清楚您想做什么。限制是在用户端构建一个图表来表示他们希望看到的调用链关系,而不是查询本身。我想做的是生成一个长度任意的查询->…->子节点。在每个子级,我可以在节点属性上指定过滤器。您可以提供密码查询来创建数据以演示问题吗?我用一个指向示例数据库密码转储的要点链接更新了帖子,该示例数据库演示了我在查询中遇到的问题。