Cypher - 如何使用" STARTS WITH"

时间:2016-12-19 15:45:17

标签: neo4j cypher

我正在寻找一种方法来结合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

2 个答案:

答案 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;