Neo4j 对同一集合的不同属性使用equals不会返回任何记录,为什么?

Neo4j 对同一集合的不同属性使用equals不会返回任何记录,为什么?,neo4j,cypher,Neo4j,Cypher,当我使用以下查询时: MATCH (emp:Employee) WHERE emp.supervisor_id = 159 RETURN emp 我得到的结果是4名员工/节点的supervisor\u id=159 对于这个查询,我还得到一个结果,即1名员工的employeeID=159: MATCH (emp:Employee) WHERE emp.employeeID = 159 RETURN emp 但是当我使用=操作符时,它确实返回(无更改,无记录) 我想这是一个逻辑错误,但我就是想

当我使用以下查询时:

MATCH (emp:Employee)
WHERE emp.supervisor_id = 159
RETURN emp
我得到的结果是4名员工/节点的
supervisor\u id=159

对于这个查询,我还得到一个结果,即1名员工的
employeeID=159

MATCH (emp:Employee)
WHERE emp.employeeID = 159
RETURN emp
但是当我使用
=
操作符时,它确实返回
(无更改,无记录)

我想这是一个逻辑错误,但我就是想不出来


任何想法请。

在您的查询中,您正在搜索标签为
Employee
的节点,其属性
employeeID
等于
supervisor\u id

或者根据我的理解,您想要的是使用标签
Employee
搜索两个不同的节点

因此,您的查询应该是:

MATCH (emp1:Employee), (emp2:Employee)
WHERE emp1.employeeID = emp2.supervisor_id
CREATE (emp1)-[:MANAGER_OF]->(emp2)
此查询创建笛卡尔积,因此如果有大量
Employee
节点,则应使用
APOC
过程()批量创建关系,如下所示:

CALL apoc.periodic.iterate(
  "MATCH (emp1:Employee) RETURN emp1",
  "MATCH (emp2:Employee) WHERE emp1.employeeID = emp2.supervisor_id CREATE (emp1)-[:MANAGER_OF]->(emp2)",
 {batchSize:5000, parallel:true}
);

干杯

您真正想要什么输出?我期待5个节点。4个节点/员工具有
主管id=159
,一个节点/员工具有
员工id=159
。最后,我的目标是在ID为159的
员工与其他4名不同的员工之间建立一种关系,例如,
-[:MANAGER\u OF]->
。请参阅@logisima的答案。他没有明确地说,但您的查询不起作用的原因是,任何给定的员工节点(emp)显然不是它自己的主管。因此需要有两个雇员节点来相互比较。当然。。。实际上我有100名员工。它们都有属性:
employeeID
supervisor\u id
。拥有
supervisor\u id=0的员工
他们是拥有
supervisor\u id=employeeid=employeed的其他员工的经理。例如,约翰的雇员id=9,主管id=0(是经理)。Maria的员工id为23,主管id为9(经理id为9-John)。Anne的员工id为67,主管id为9(经理id为9-John)。Harry的员工id为49,主管id=0(是经理)。Anne R.的雇员id为11,主管id为49(经理id为49-Harry)。第一个查询可以正常工作。第二个抛出以下错误:
没有名为apoc.periodic.iterate`registered用于此数据库实例的过程。请确保您正确拼写了过程名称,并正确部署了该过程。`FYI-Her is Neo4J我正在使用:
版本:3.2.5,版本:Community
您必须安装所有APOC。看看我给出的url,然后转到
安装
已安装,Neo4J重新启动,错误保持不变。由于我没有在OSx应用程序下运行Ne04J,所以我确实将
JAR
保存在:
/Users//Documents/Neo4j/default.graphdb/plugins
下。有什么想法吗?@ligisma:关于你回答中的第一个问题,如果对关系使用
UNIQUE
会有帮助吗?e、 g
匹配(emp1:Employee),(emp2:Employee),其中emp1.employeeID=emp2.supervisor\u id创建唯一(emp1)-[:MANAGER\u OF]->(emp2)
CALL apoc.periodic.iterate(
  "MATCH (emp1:Employee) RETURN emp1",
  "MATCH (emp2:Employee) WHERE emp1.employeeID = emp2.supervisor_id CREATE (emp1)-[:MANAGER_OF]->(emp2)",
 {batchSize:5000, parallel:true}
);