Neo4j匹配满足特定模式的关系参数

时间:2017-06-29 12:10:24

标签: neo4j cypher

使用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中读到的那样,不应该通过驻留在数据库中的名称动态加载参数。

可能还有一些解决方法?

2 个答案:

答案 0 :(得分:3)

[增订]

原始答案:

你的问题没有说得很清楚,但无论如何我都会尝试回答。

我觉得这样的事情就是你想要的:

parameters: {
  "minimum": 19,
  "maximum": 23
}

MATCH (n)-[r:MY_RELATION]-() WHERE $maximum >= r.age >= $minimum
...

无需指定&#34;类型&#34;参数。只需确保您的参数值属于合适的类型。

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

假设参数以这种方式指定(其中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将在哪里,例如,键入&#34; age_range&# 34;,并包含属性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
...

答案 1 :(得分:0)

此解决方案是否符合您的要求?

考虑以下小样本数据集

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 *