使用cypher,有没有办法匹配关系满足某个输入模式的路径?
我知道我可以做类似
的事情parameters: {
"age": 20
}
MATCH (n)-[r:MY_RELATION]-() WHERE $age>18 AND $age<24 ...
当我想只匹配满足模式{ "type": "integer", "minimum": 19, "maximum": 23 }
的关系时。
但是我必须在关系中指定最小和最大范围。如果我想将字符串与模式匹配,或者甚至更复杂的类型(如带子子参数的地址等),该怎么办?
有通用的方法吗?
修改 我会尝试更清楚地陈述问题。我想要的是一个图形和一个(参数化的)查询来遍历该图形,例如:
编辑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中读到的那样,不应该通过驻留在数据库中的名称动态加载参数。
可能还有一些解决方法?
答案 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
包含属性test
,min
和max
):
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;,并包含属性min
和max
):
MATCH (n)-[r]-(m)
WHERE TYPE(r) = $test AND r.min <= $age <= r.max
RETURN n, r, m;
为了帮助您确定使用哪种方法,您应profile使用代码和实际数据的两种方法来查看哪种方法更快。
以下参数和查询应该执行您想要的操作。方括号可用于动态指定属性的名称。
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 *