Neo4j 如何返回满足特定条件的任何节点的列表,以及仅在满足条件时可用的值?

Neo4j 如何返回满足特定条件的任何节点的列表,以及仅在满足条件时可用的值?,neo4j,cypher,Neo4j,Cypher,我想从我的数据集中得到一个国家的列表。假设我写这篇文章的组织在不同的国家“运作”。然而,operate的定义可以用几种方式来界定 首先,如果该公司的员工在该国工作 第二个,如果在该国家/地区有任何被授予的业务得到支持(如果该国家/地区附带了该奖励中的任务,则该奖励已知在该国家/地区) 第三方,前提是该组织获得了在那里开展业务的专门许可。例如,该公司可能获得了许可证,但目前实际上并未在那里开展任何工作 因此,我想从另一端获得一些json,我可以使用它来增强与svg国家地图的交互。这意味着我需要一个

我想从我的数据集中得到一个国家的列表。假设我写这篇文章的组织在不同的国家“运作”。然而,operate的定义可以用几种方式来界定

首先,如果该公司的员工在该国工作

第二个,如果在该国家/地区有任何被授予的业务得到支持(如果该国家/地区附带了该奖励中的任务,则该奖励已知在该国家/地区)

第三方,前提是该组织获得了在那里开展业务的专门许可。例如,该公司可能获得了许可证,但目前实际上并未在那里开展任何工作

因此,我想从另一端获得一些json,我可以使用它来增强与svg国家地图的交互。这意味着我需要一个符合这些标准的国家的json列表,以及关于每个国家符合哪些标准的一些信息(例如:{国家:“美国”,代码:“美国”,hasPeople:true,hasActiveAward:false,isLicensed:true}),或者我需要三个单独的列表(每个标准一个)其中包括一部分国家

我试过很多东西,包括下面这一个,这一个失败得最惊人,同时也是最简单的阅读理解

// get all types of country
match (c1)<-[:SITS_IN|GEO_IN*]-(p:Person)
match (c2)<-[:TASK_IN_COUNTRY]-(:Task)-[:PART_OF*2]->(a:Award {awardStatus:"ACTIVE"})
match (c3)<-[:LICENSED_IN]-(d:Department)

return {
    peopleCountries:[{country:c1.name, code:c1.code, people:count(p)}],
    awardCountries:[{country:c2.name, code:c2.code, awards:count(a)}],
    licensedCountries:[{country:c3.name, code:c3.code, department:d.name}]
    }
//获取所有类型的国家/地区

match(c1)需要注意的一件事是一行中的多个匹配或可选匹配,您的目的是稍后聚合结果。请记住,Neo4j将结果建立为行,并在这些行上处理操作(匹配和可选匹配),即使这是多余的

例如,以您的前两个可选匹配项为例:

with c
optional match (c)<-[:SITS_IN|GEO_IN*]-(p:Person)
optional match (c)<-[:TASK_IN_COUNTRY]-(:Task)-[:PART_OF*2]->(a:Award {awardStatus:"ACTIVE"})
与c

可选匹配(c)需要注意的一件事是多个匹配或一行中的可选匹配,您的目的是稍后聚合结果。请记住,Neo4j将结果建立为行,并在这些行上处理操作(匹配和可选匹配),即使这是多余的

例如,以您的前两个可选匹配项为例:

with c
optional match (c)<-[:SITS_IN|GEO_IN*]-(p:Person)
optional match (c)<-[:TASK_IN_COUNTRY]-(:Task)-[:PART_OF*2]->(a:Award {awardStatus:"ACTIVE"})
与c

可选匹配(c)了解性能问题是否与国家/地区匹配有关(在
与c
匹配之前)或在进行可选匹配时。您能否运行查询的第一部分(将
替换为c
替换为
返回c
),并为我们提供该部分的执行时间?这将有助于了解性能问题是与国家/地区匹配(在
与c
匹配之前)还是在进行可选匹配时。您能否运行查询的第一部分(将
替换为c
,将
替换为
返回c
),并为我们提供该部分的执行时间?这非常有效。感谢您提供的解决方案,更感谢您的见解。我在某种程度上找到了解决方案,但出于某种原因,我没有将额外的语句与用可选关键字分隔不同匹配项的语句结合起来。现在它工作得很好。而且,作为一个提醒。当我运行上面第二个示例的配置文件时,与您重新配置的配置文件相比,您的配置文件的数据库命中率约为1/10。关于在语句中收集初始“c”的部分将查询从复杂度从高到低重新排序,也有很好的建议。再次感谢你的解释。这非常有效。感谢您提供的解决方案,更感谢您的见解。我在某种程度上找到了解决方案,但出于某种原因,我没有将额外的语句与用可选关键字分隔不同匹配项的语句结合起来。现在它工作得很好。而且,作为一个提醒。当我运行上面第二个示例的配置文件时,与您重新配置的配置文件相比,您的配置文件的数据库命中率约为1/10。关于在语句中收集初始“c”的部分将查询从复杂度从高到低重新排序,也有很好的建议。再次感谢你的解释。
match (c:Country)
where exists((c)<-[:LICENSED_IN]-(:Department))
or exists((c)<-[:SITS_IN|GEO_IN*]-(:Person)) 
or exists((c)<-[:TASK_IN_COUNTRY]-(:Task)-[:PART_OF*2]->(:Award {awardStatus:"ACTIVE"}))
with c
optional match (c)<-[:SITS_IN|GEO_IN*]-(p:Person)
with c, count(distinct p) as people
optional match (c)<-[:TASK_IN_COUNTRY]-(:Task)-[:PART_OF*2]->(a:Award {awardStatus:"ACTIVE"})
with c, people, count(distinct a) as awards
optional match (c)<-[:LICENSED_IN]-(d:Department)
with c, people, awards, collect(d.name) as departments
return {
    country:c.name,
    people:people,
    awards:awards,
    departments:departments
}