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

时间:2019-07-11 15:56:23

标签: neo4j cypher

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

用户在从UI构建路径时遇到的一些限制是:它不能有循环,不能有多个子节点的节点有多个子节点,节点不能有一个以上的传入边。仅从他们的角度来看这是强制执行的,而不是在查询本身中执行。

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

我已经尝试了Cypher查询的多种变体,例如将路径分解为多个MATCH语句,修改关系以及其他我能想到的东西。

这里是示例密码转储的要点 cypher-dump

此查询为我提供了我要获取的路径,但未在n_four上指定名称或类型。

SELECT COUNT(volunteer_id),shift_id FROM rota
WHERE volunteer_id IN(
    SELECT volunteer_id
    FROM (
      SELECT COUNT(shift_id) c FROM rota GROUP BY volunteer_id
    ) as tmp WHERE c=6

)
GROUP BY shift_id

CorrectGraph

该查询是我想要的工作,但是它遗漏了我难以理解的第三级叶子。

    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

IncorrectGraph

我注意到的是,当我在查询中“ ... RETURN n_four”时,它也包含了第三级的节点。

1 个答案:

答案 0 :(得分:1)

此行为是由您(可能不适当)在您的[*0..]模式中使用MATCH引起的。

仅供参考:

  • [*0..]匹配0个或更多关系。例如,即使(a)-[*0..]->(b)a是同一个节点,b也会成功(并且该节点与其自身没有关系)。

  • 默认下限为1。因此[*]等效于[*..][*1..]

您的2个查询使用相同的MATCH模式,以...->(n_three)-[*0..]->(n_four)结尾。

  • 您的第一个查询没有为WHERE指定任何n_four测试,因此查询可以自由返回其中n_threen_four是< em>相同的节点。这种缺乏特异性的原因就是查询能够返回2个额外的节点的原因。

  • 您的第二个查询为WHERE指定了n_four测试,这使得n_threen_four不可能是同一节点。现在查询更加挑剔,因此不再返回这两个额外的节点。

除非确定要有选择地匹配0个关系,否则不应使用[*0..]。它还可能会增加不必要的开销。而且,正如您现在所知道的,它也使查询变得有些棘手。