如何编写包含变量的查询?

时间:2018-03-12 22:19:11

标签: neo4j cypher

我有多个标签的节点:

create(p:SmartPhone:Phone:Product {name:'iPhoneX'})-[r:productOf]->(c:Company {name:"Apple"})

create(p:SmartTV:Product {name:string})

在创建查询时,我必须从用户的问题中解析我的查询。例如,“你有Apple的智能手机吗?”。在我的代码中,MATCH语句中的标签是变量$ smartPhone。我不能硬编码不同的类别,因为它必须动态地从用户的问题中解析,并且有太多这样的类别。

match (p:SmartPhone)-[r:productOf]->(c:Company {name:'Apple'})
return p

这里我不能使用p:SmartPhone,它必须是“$ SmartPhone”。有没有办法写这个查询?这似乎是一个非常普遍的需求。如何处理这类问题?有什么建议吗?

2 个答案:

答案 0 :(得分:1)

除了@InverseFalcon评论中的建议(另一个答案),您可以通过使每个Product节点与一个(或多个)ProductType节点相关来更改数据模型(一个或多个)。

例如,要创建一个新的Product(其名称由$prodName提供),它有两种不同的产品类型(其类型在$types列表参数中),由名称位于Company的{​​{1}},您可以使用以下查询。您还应该为$compName:Company(name)创建索引,以加快ProductType(type) es。

MATCH

使用此建议的数据模型,以下是从给定公司(MATCH (c:Company {name: $compName}) CREATE (p:Product {name: $prodName})-[:productOf]->(c) MATCH (t:ProductType) WHERE t.type IN $types CREATE (p)-[:HAS_TYPE]->(t); )查找给定类型(Product)的$type的一种方法,您可以使用此查询:

$compName

您还可以在MATCH (p:Product)-[:productOf]->(:Company {name: $compName}) WHERE (:ProductType {type: $type})<-[:HAS_TYPE]-(p) RETURN p; 列表中找到具有所有类型的给定ProductCompany)的$compName

$types

答案 1 :(得分:0)

Labels和关系&#39; type无法在密码查询中进行参数化。

所以你有两个选择:

  • 在您的应用程序代码中创建查询
  • 使用具有动态创建节点和关系的一些过程的APOC