Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 如何编写包含变量的查询?_Neo4j_Cypher - Fatal编程技术网

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;