我认为这是一个很长的问题,可能是一个简单的答案。但是我认为在我的查询逻辑出现问题的情况下包含完整的上下文是明智的(请原谅格式如果它关闭 - 我已经重命名了变量并且它可能会出错,我需要帮助理论,而不是结构)
组织可以设立子办事处
console.log
或总公司
(o:Organisation)-[:sub_office]->(an:Organisation)
不同子办事处的人员可以是员工或前雇员 EX1
(o)-[:head_office]->(ho:Organisation)
人员可以通过管理关系与其他人联系。这些管理链接可以是可变长度的。 EX2
(o)-[:employee]->(p:Person{name:'person1'})<-[:ex_employee]-(an)
我查询: -组织, - 子办公室, - 他们是如何相关的 这些都很好(我想......)
我遇到的问题是返回与组织(员工或前雇员)相关联的人员以及他们与组织的关系,但前提是他们直接连接到其他组织(如在EX1中)或通过管理链(EX2的所有内容 - 我已经尝试通过标记未被查询返回的人员作为名称&#39; NOT_RETURNED&#39;)
来使其更清晰。我创建了以下内容:
(o)-[:employee]->(p:Person{name:'person2'})-[:managed]->(p:Person{name:'person3'})<-[:ex_employee]-(an)
(o)-[:ex_employee]->(p:Person{name:'person4'})-[:managed]->(p:Person{name:'NOT_RETURNED1'})-[:managed]->(p:Person{name:'person5'})<-[:employee]-(an)
(o)-[:ex_employee]->(p:Person{name:'person6'})<-[:managed]-(p:Person{name:'NOT_RETURNED2'})<-[:managed]-(p:Person{name:'person8'})<-[:employee]-(an)
(o)-[:ex_employee]->(p:Person{name:'person9'})-[:managed]->(p:Person{name:'NOT_RETURNED4'})-[:managed]->(p:Person{name:'NOT_RETURNED5'})<-[:managed]-(p:Person{name:'person11'})<-[:employee]-(an)
....
我希望所有收集的结果看起来像:
MATCH (queryOrganisation:Organisation{name:'BigCorp'})-[orgRel]-(relatedOrganisation:Organisation)
WITH queryOrganisation, orgRel, relatedOrganisation
MATCH (queryOrganisation)-[employmentRel]->(queryPerson:Person)
OPTIONAL MATCH (queryPerson)<-[relatedOrgRel]-(relatedOrganisation)
OPTIONAL MATCH (queryPerson)-[:managed*1..]-(relatedPerson:Person)<-[relatedOrgRel]-(relatedOrganisation)
WITH queryOrganisation, orgRel, relatedOrganisation, employmentRel, queryPerson, relatedOrgRel, relatedPerson
WHERE NOT queryOrganisation.name = relatedOrganisation.name
RETURN ID(queryOrganisation) as queryOrganisationID,
ID(startNode(orgRel))as startNodeId, type(orgRel)as orgRel, ID(endNode(orgRel))as endNodeId,
ID(relatedOrganisation)as relatedOrganisationId, relatedOrganisation.name as relatedOrganisationName
COLLECT({
queryPerson:{endpoint:{ID:ID(queryPerson)}, endpointrelationship: type(employmentRel)},
relatedPerson:{endpoint:{ID:coalesce(ID(relatedPerson),ID(queryPerson))}, endpointrelationship:type(relatedOrgRel)}
}) as rels
然而,直接连接的节点结果(相同的节点ID)显示为:
{
"startEmp":{
"ID":2715,
"startrelationship":"employee"
},
"relatedEmp":{
"ID":2722,
"endrelationship":"ex employee"
}
}
为什么类型(relatedOrgRel)出现null?我是否误解了OPTIONAL MATCH中发生的事情,并且在第二个OPTIONAL MATCH期间,relatedOrgRel被null覆盖?如果是这样,我该如何补救?
由于
答案 0 :(得分:1)
不,OPTIONAL MATCH不能覆盖已定义的变量。
我认为问题的原因是当你的第二个OPTIONAL MATCH与任何东西都没有匹配时,但这部分是由你收回的人员收集的COALESCE隐藏了一些结论:
...
relatedPerson:{endpoint:{ID:coalesce(ID(relatedPerson),ID(queryPerson))}, endpointrelationship:type(relatedOrgRel)}
...
如果relatedPerson
为空,如果你的第二个OPTIONAL MATCH失败,那么你将回到queryPerson
的id,但是因为你没有使用COALESCE { {1}},这仍然是null。你需要一个COALESCE,否则你需要找到一个更好的方法来处理你的OPTIONAL MATCHES中的null变量。