存在带有动态标签的密码查询

时间:2019-05-09 09:27:09

标签: neo4j cypher

给出一个简单的exists查询,例如

RETURN exists( (:NodeA {propA:{0}})-[:REL_B]->(:NodeB) )

如何动态查询节点标签NodeA?例如

RETURN exists( (:{1} {propA:{0}})-[:REL_B]->(:NodeB) )

但这不起作用。我知道您可以使用{1} in labels(n),但是在EXISTS模式中如何将其用作WHERE子句?

2 个答案:

答案 0 :(得分:2)

否,您不能在节点标签中使用参数。有关详细信息,请参见https://neo4j.com/docs/cypher-manual/current/syntax/parameters/

  

参数不能用于以下用途:

     
      
  • 属性键;因此,MATCH(n)在哪里n。$ param ='something'无效
  •   
  • 关系类型,例如:REL_B
  •   
  • 诸如:NodeA
  • 的标签   

答案 1 :(得分:1)

此纯密码查询应该可以工作,但是性能不佳,因为它将扫描所有节点以找到适当的x个节点,并且无法利用indexing

MATCH (x{propA: $0})
WHERE $1 IN LABELS(x)
RETURN EXISTS((x)-[:REL_B]->(:NodeB));

更高效的方法是使用APOC过程apoc.cypher.run来执行带有所需标签硬编码的Cypher查询:

CALL apoc.cypher.run(
  "RETURN EXISTS((:`" + $1 + "` {propA: $p})-[:REL_B]->(:NodeB)) AS res",
  {p: $0}) YIELD value
RETURN value.res;

这样,您还可以利用indexing