【问题标题】:Neo4j match Relationship parameters satisfying a certain schemaNeo4j匹配满足一定模式的关系参数
【发布时间】:2017-07-03 17:03:32
【问题描述】:

使用 cypher,有什么方法可以匹配关系一般满足特定输入模式的路径?

我知道我可以做类似的事情

parameters: {
    "age": 20
}

MATCH (n)-[r:MY_RELATION]-() WHERE $age>18 AND $age<24 ...

当我只想匹配满足架构 { "type": "integer", "minimum": 19, "maximum": 23 } 的关系时。

但是我必须指定关系中的最小和最大范围。如果我想将字符串与模式或更复杂的类型(如带有子参数的地址等)进行匹配怎么办?

有通用的方法吗?

编辑: 我会尝试更清楚地说明这个问题。我想要的是一个图和一个(参数化的)查询来遍历该图,这样:

  • 我得到了遍历中的所有节点
  • 图中的关系对查询参数有一定的限制(例如整数的最小值)
  • 遍历只遵循满足约束的边
  • 我需要对整数进行约束,例如 min/max,但也对字符串进行约束,例如模式等。

编辑 2: 我想要的甚至可能都不可能。 我希望有关约束的所有信息都驻留在边缘,包括要测试的参数。所以我想要一些类似的东西

parameters: { "age": 20, "location": "A" }
MATCH (n)-[r]-()
WHERE r.testtype='integer' AND getParameterByName(r.testparamname) < r.max
OR r.testtype='string' AND getParameterByName(r.testparamname)=r.allowedStringValue

当然,正如在neo4j documentation about parameter functionality 中所读到的,应该不可能通过驻留在数据库中的名称来动态加载参数。

可能还有一些解决方法?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    [更新]

    原答案:

    你的问题表述的不是很清楚,但我还是会尽量回答。

    我认为你想要这样的东西:

    parameters: {
      "minimum": 19,
      "maximum": 23
    }
    
    MATCH (n)-[r:MY_RELATION]-() WHERE $maximum >= r.age >= $minimum
    ...
    

    无需指定“类型”参数。只需确保您的参数值属于适当的类型即可。

    新答案(基于更新的问题):

    假设参数是这样指定的(其中test表示测试的类型):

    parameters: {
      "age": 20,
      "test": "age_range"
    }
    

    然后您可以这样做(其中r 将包含属性testminmax):

    MATCH (n)-[r:MY_RELATION]-(m)
    WHERE r.test = $test AND r.min <= $age <= r.max
    RETURN n, r, m;
    

    或者,如果您不需要所有关系都属于同一类型,这也应该可以工作并且可能更容易可视化(其中r 将是,例如,类型“age_range”,并包含属性minmax):

    MATCH (n)-[r]-(m)
    WHERE TYPE(r) = $test AND r.min <= $age <= r.max
    RETURN n, r, m;
    

    为了帮助您决定使用哪种方法,您应该 profile 使用您的代码和一些实际数据来查看这两种方法,看看哪种方法更适合您。

    更新的答案(基于有问题的编辑 2)

    下面的参数和查询应该做你想做的事。方括号可用于动态指定属性的名称。

    parameters: {
      "data": {
        "age": 20,
        "location": "A"
      }
    }
    
    MATCH (n)-[r]-()
    WHERE r.testtype='integer' AND $data[r.testparamname] < r.max
    OR r.testtype='string' AND $data[r.testparamname]=r.allowedStringValue
    ...
    

    【讨论】:

    • 请在原始问题中查看我的编辑。特别是,我需要约束驻留在图形的关系中,而不是参数中(在您的示例中,最小值/最大值在参数中)。参数应该是满足约束的数据
    • 感谢您的更新。不过,它还不够通用。请查看更新后的问题
    【解决方案2】:

    此解决方案是否满足您的要求?

    考虑以下小样本数据集

    MERGE (p1:Person {name: 'P 01'})
    MERGE (p2:Person {name: 'P 02'})
    MERGE (p3:Person {name: 'P 03'})
    MERGE (p1)-[:MY_RELATION { minimum: 19, maximum: 23 }]->(p2)
    MERGE (p2)-[:MY_RELATION { minimum: 19, maximum: 20 }]->(p3)
    

    此查询将仅返回提供的参数符合关系约束的节点和关系(例如,$age = 21 应该只返回单行)。这基本上与@cybersam 的提议相反。

    MATCH (s:Person)-[r:MY_RELATION]->(e:Person)
    WHERE r.minimum <= $age <= r.maximum
    RETURN *
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-18
      • 1970-01-01
      相关资源
      最近更新 更多