满足特定模式的Neo4j匹配关系参数
使用cypher,是否有任何方法可以匹配关系一般满足特定输入模式的路径 我知道我可以做像这样的事情满足特定模式的Neo4j匹配关系参数,neo4j,cypher,Neo4j,Cypher,使用cypher,是否有任何方法可以匹配关系一般满足特定输入模式的路径 我知道我可以做像这样的事情 parameters: { "age": 20 } MATCH (n)-[r:MY_RELATION]-() WHERE $age>18 AND $age<24 ... 当然,正如可以在中读取的那样,不可能通过驻留在DB中的名称动态加载参数 可能还有一些解决办法?[更新] 原始答复: 你的问题没有说得很清楚,但我还是会尽力回答的 我想这就是你想要的: parameters:
parameters: {
"age": 20
}
MATCH (n)-[r:MY_RELATION]-() WHERE $age>18 AND $age<24 ...
当然,正如可以在中读取的那样,不可能通过驻留在DB中的名称动态加载参数
可能还有一些解决办法?[更新]
原始答复:
你的问题没有说得很清楚,但我还是会尽力回答的
我想这就是你想要的:
parameters: {
"minimum": 19,
"maximum": 23
}
MATCH (n)-[r:MY_RELATION]-() WHERE $maximum >= r.age >= $minimum
...
无需指定“类型”参数。只需确保参数值的类型正确即可
新答案(基于更新的问题):
假设以这种方式指定参数(其中test
表示测试类型):
然后可以执行此操作(其中r
将包含属性test
、min
和max
):
为了帮助您决定使用哪种方法,您应该在代码和一些实际数据中使用这两种方法,以查看哪种方法对您来说更快
甚至更新的答案(基于问题中的编辑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
...
参数:{
“数据”:{
“年龄”:20岁,
“地点”:“A”
}
}
匹配(n)-[r]-()
其中r.testtype='integer'和$data[r.testparamname]
此解决方案是否满足您的要求
考虑以下小样本数据集
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 *
匹配(s:Person)-[r:MY_RELATION]->(e:Person)
其中r.最小值请参见原始问题中的我的编辑。特别是,我需要约束驻留在图形的关系中,而不是参数中(在您的示例中,min/max位于参数中)。参数应该是满足约束的数据谢谢您的更新。不过,它还不够通用。请参阅更新的问题
MATCH (n)-[r]-(m)
WHERE TYPE(r) = $test AND r.min <= $age <= r.max
RETURN n, r, m;
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
...
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)
MATCH (s:Person)-[r:MY_RELATION]->(e:Person)
WHERE r.minimum <= $age <= r.maximum
RETURN *