我有多个标签的节点:
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”。有没有办法写这个查询?这似乎是一个非常普遍的需求。如何处理这类问题?有什么建议吗?
答案 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;
列表中找到具有所有类型的给定Product
(Company
)的$compName
:
$types
答案 1 :(得分:0)
Labels
和关系&#39; type
无法在密码查询中进行参数化。
所以你有两个选择: