在Neo4j中匹配、排序和返回多个节点

在Neo4j中匹配、排序和返回多个节点,neo4j,cypher,Neo4j,Cypher,我在Neo4j中有多个节点,它们有个人、技能、兴趣、公司等标签(大约8-9个不同的标签)。我想搜索/匹配这些节点中的属性,并返回有限的结果,比如50人 我还想看看一个人是否在多个不同的节点中使用了不同的标签,并能够根据这些标签对其进行排序,或者根据一个排名,即个人节点中的匹配比兴趣节点中的匹配排名更高 我尝试过不同的方法,但发现很难在一个带有9个不同标签的查询中完成所有这些。我还需要返回的每个人的信息,这是所有不同节点(个人、技能、公司等)的组合 这就是我到目前为止所做的: MATCH (per

我在Neo4j中有多个节点,它们有个人、技能、兴趣、公司等标签(大约8-9个不同的标签)。我想搜索/匹配这些节点中的属性,并返回有限的结果,比如50人

我还想看看一个人是否在多个不同的节点中使用了不同的标签,并能够根据这些标签对其进行排序,或者根据一个排名,即个人节点中的匹配比兴趣节点中的匹配排名更高

我尝试过不同的方法,但发现很难在一个带有9个不同标签的查询中完成所有这些。我还需要返回的每个人的信息,这是所有不同节点(个人、技能、公司等)的组合

这就是我到目前为止所做的:

MATCH (person:Person)
WHERE person.name =~ '(?i).*some_search_query.*'
RETURN COLLECT(DISTINCT person) as persons 

UNION ALL 

MATCH(skill:Skill) <- [:HAS_SKILL] - (person:Person) 
WHERE skill.name =~ '(?i).*some_search_query.*'
RETURN COLLECT(DISTINCT person) as persons

UNION ALL
etc...
matchInPerson和matchInSkills等现在可以有重复项,这是有意的,因为我想看看是否可以在多个节点中有匹配项

我现在的问题是,我需要某种方法来删除重复项,然后可能会向具有重复项的人员添加一个属性,如person.matches+=1(或类似的方法来计算一个人的数学数)

也许最重要的是,我想限制响应(在重复项被删除和计数之后),因为我不想返回数千个结果。根据重复点击数对reults进行排序也很好


希望这在cypher查询本身中是可以实现的,这样我就不必处理查询结果。

您考虑过使用吗?是的,这是我一直在尝试的许多方法之一。您能后退一步,更清楚地解释您试图对正在构建的系统提出的一个或多个问题吗?暂时忽略neo4j,将系统视为一个黑匣子,您的输入和期望的输出是什么?当然,我的目标是向系统传递一个参数(字符串)并在数据库中进行搜索。我想看看每个人身上有多少点击率。假设我对人A(在技能、兴趣和组中)有3次点击,这个人现在在我的搜索中的排名高于只有2次点击的人B。现在我想将结果从最高排名排序到最低排名,将结果限制为50人,然后返回结果。
OPTIONAL MATCH (person:Person)
WHERE person.name =~ '(?i).*some_search_query.*'
WITH COLLECT(DISTINCT person) as matchInPerson

OPTIONAL MATCH(skill:Skill) <- [:HAS_SKILL] - (person:Person)
WHERE skill.name =~ '(?i).*some_search_query.*'
WITH COLLECT(DISTINCT person) as matchInSkill, matchInPerson

OPTIONAL MATCH(group:Skill) <- [:MEMBER_OF_GROUP] - (person:Person)
WHERE group.name =~ '(?i).*some_search_query.*'
WITH COLLECT(DISTINCT person) as matchInGroups, matchInPerson, matchInSkill

OPTIONAL MATCH(company:Company) <- [rel:WORKED_AT] - (person:Person)
WHERE company.name =~ '(?i).*some_search_query.*' OR rel.description =~ '(?i).*some_search_query.*'
WITH COLLECT(DISTINCT person) as matchInCompany, matchInPerson, matchInSkill, matchInGroups

OPTIONAL MATCH(country:Country) <- [:LIVES_IN] - (person:Person)
WHERE country.name =~ '(?i).*some_search_query.*'
WITH COLLECT(DISTINCT person) as matchInCountry, matchInPerson, matchInSkill, matchInGroups, matchInCompany

OPTIONAL MATCH(city:City) <- [:LIVES_IN] - (person:Person)
WHERE city.name =~ '(?i).*some_search_query.*'
WITH COLLECT(DISTINCT person) as matchInCity, matchInPerson, matchInSkill, matchInGroups, matchInCompany, matchInCountry

OPTIONAL MATCH(interest:Interest) <- [:HAS_INTEREST] - (person:Person)
WHERE interest.name =~ '(?i).*some_search_query.*'
WITH COLLECT(DISTINCT person) as matchInInterest, matchInPerson, matchInSkill, matchInGroups, matchInCompany, matchInCountry, matchInCity

OPTIONAL MATCH(industry:Industry) <- [*1..2] - (person:Person)
WHERE industry.name =~ '(?i).*some_search_query.*'
WITH COLLECT(DISTINCT person) as matchInIndustry, matchInPerson, matchInSkill, matchInGroups, matchInCompany, matchInCountry, matchInCity, matchInInterest

 OPTIONAL MATCH(certification:Certification) <- [rel:HAS_CERTIFICATION] - (person:Person)
WHERE certification.name =~ '(?i).*some_search_query.*' OR rel.by =~ '(?i).*some_search_query.*'
WITH COLLECT(DISTINCT person) as matchInCertification, matchInPerson, matchInSkill, matchInGroups, matchInCompany, matchInCountry, matchInCity, matchInInterest, matchInIndustry

OPTIONAL MATCH(project:Project) <- [:WORKED_ON_PROJECT] - (person:Person)
WHERE project.name =~ '(?i).*some_search_query.*'
WITH COLLECT(DISTINCT person) as matchInProject, matchInPerson, matchInSkill, matchInGroups, matchInCompany, matchInCountry, matchInCity, matchInInterest, matchInIndustry, matchInCertification

RETURN matchInPerson, matchInSkill, matchInGroups, matchInCompany, matchInCountry, matchInCity, matchInInterest, matchInIndustry, matchInCertification, matchInProject
[
   {
      "matchInPerson": [],
      "matchInSkill": [],
      "matchInGroups": [],
      "matchInCompany": [],
      "matchInCountry": [],
      "matchInCity": [],
      "matchInInterest": [],
      "matchInIndustry": [],
      "matchInCertification": [],
      "matchInProject": []
   }
]