Neo4j 如何编写包含变量的查询?
我有多个标签的节点:Neo4j 如何编写包含变量的查询?,neo4j,cypher,Neo4j,Cypher,我有多个标签的节点: create(p:SmartPhone:Phone:Product {name:'iPhoneX'})-[r:productOf]->(c:Company {name:"Apple"}) create(p:SmartTV:Product {name:string}) 在创建查询时,我必须从用户的问题解析查询。例如,“你有苹果的智能手机吗?”。在我的代码中,MATCH语句中的标签将是一个变量$smartPhone。我不能硬编码不同的类别,因为它必须从用户的问题中动态
create(p:SmartPhone:Phone:Product {name:'iPhoneX'})-[r:productOf]->(c:Company {name:"Apple"})
create(p:SmartTV:Product {name:string})
在创建查询时,我必须从用户的问题解析查询。例如,“你有苹果的智能手机吗?”。在我的代码中,MATCH语句中的标签将是一个变量$smartPhone。我不能硬编码不同的类别,因为它必须从用户的问题中动态解析,而且这样的类别太多了
match (p:SmartPhone)-[r:productOf]->(c:Company {name:'Apple'})
return p
这里我不能使用p:SmartPhone,它必须是类似于“$SmartPhone”的东西。有没有写这个查询的方法?这似乎是一种非常普遍的需要。如何处理这类问题?有什么建议吗?
标签和关系的类型不能在密码查询中参数化
所以你有两个选择:
- 在应用程序代码中创建查询
- 使用APOC,它有一些动态创建节点和关系的过程
除了@InverseFalcon评论中的建议(另一个答案),您可以通过使每个产品
节点与一个(或多个)产品类型
节点相关来更改数据模型
例如,要创建一个新的产品
(其名称由$prodName
提供),该产品具有两种不同的产品类型(其类型在$types
列表参数中),由一家名为$compName
的公司制作,您可以使用下面的查询。您还应该为:Company(name)
和ProductType(type)
创建索引,以加快匹配的速度
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);
有了这个提议的数据模型,这里有一种从给定公司($compName
)查找给定类型($type
)的产品的方法,您可以使用以下查询:
MATCH (p:Product)-[:productOf]->(:Company {name: $compName})
WHERE (:ProductType {type: $type})<-[:HAS_TYPE]-(p)
RETURN p;
或者,您可以更改您的模型。任何可以参数化的东西都应该是属性。如果标签在硬编码的上下文中仍然有用,那么它可以代替标签,或者作为标签的补充。添加为属性是一种选择。
MATCH (p:Product)-[:productOf]->(:Company {name: $compName})
WHERE ALL(x IN $types WHERE (:ProductType {type: x})<-[:HAS_TYPE]-(p))
RETURN p;