我正在寻找一种方法来结合Cypher" IN" "开始与#34;查询。换句话说,我正在寻找一种方法来查找以使用IN作为数组提供的特定字符串序列开头的节点。
目标是让查询尽可能少地针对数据库运行。
我浏览了文档,并且使用了Neo4j,但是无法将以下两个查询合并为一个:
MATCH (a:Node_type_A)-[]->(b:Node_type_B)
WHERE a.prop_A IN [...Array of Strings]
RETURN a.prop_A, COLLECT ({result_b: b.prop_B})
和
MATCH (a:Node_type_A)-[]->(b:Node_type_B)
WHERE a.prop_A STARTS WITH 'String'
RETURN a.prop_A, b.prop_B
有没有办法将这两种方法结合起来?
非常感谢任何帮助。
Krid
答案 0 :(得分:3)
您希望确保在您的Node_type_A(prop_A)上有一个索引或唯一约束(以适用者为准),以加快查找速度。
如果我正确地阅读您的要求,此查询可能适合您,根据需要添加输入字符串(如果可以,请参数化它们)。
WITH [...] as inputs
UNWIND inputs as input
// each string in inputs is now on its own row
MATCH (a:Node_type_A)
WHERE a.prop_A STARTS WITH input
// should be an fast index lookup for each input string
WITH a
MATCH (a)-[]->(b:Node_type_B)
RETURN a.prop_A, COLLECT ({result_b: b.prop_B})
答案 1 :(得分:0)
这样的事情应该有效:
MATCH (a:Node_type_A)-[]->(b:Node_type_B)
WITH a.prop_A AS pa, b.prop_B AS pb
WITH pa, pb,
REDUCE(s = [], x IN ['a','b','c'] |
CASE WHEN pa STARTS WITH x THEN s + pb ELSE s END) AS pbs
RETURN pa, pbs;