Join 如何改进Cypher中的多连接查询
我正在寻找在我的密码查询中进行某种多重连接的最佳方法。我找到了一个解决方案,但对我来说似乎有点太复杂了。 此查询的目标是从第一个节点开始,通过多种类型的关系从与第一个节点相关的许多其他节点检索id和“name”属性(参见下文)Join 如何改进Cypher中的多连接查询,join,neo4j,cypher,Join,Neo4j,Cypher,我正在寻找在我的密码查询中进行某种多重连接的最佳方法。我找到了一个解决方案,但对我来说似乎有点太复杂了。 此查询的目标是从第一个节点开始,通过多种类型的关系从与第一个节点相关的许多其他节点检索id和“name”属性(参见下文) START c=节点(72) 可选匹配(c)(专利) 返回collect中的[x(不同于_board))|{id:id(x),name:x.name}]作为管理, [x在collect(独特的(股东)){id:id(x),name:x.name}]中作为股东, [x在co
START c=节点(72)
可选匹配(c)(专利)
返回collect中的[x(不同于_board))|{id:id(x),name:x.name}]作为管理,
[x在collect(独特的(股东)){id:id(x),name:x.name}]中作为股东,
[x在collect(DISTINCT(product))|{id:id(x),name:x.name}]中作为产品,
[x在collect(DISTINCT(customer))|{id:id(x),name:x.name}]中作为客户,
[x在collect(DISTINCT(industry_section)){id:id(x),name:x.name}]中作为行业部门,
[x在collect(DISTINCT(patent))|{id:id(x),name:x.name}]中作为专利
这个查询返回6列,每个列包含一个元组列表(id&name)。
你看到如何改进了吗?(尤其是丑陋的部分“提取/收集/区分”)
或者,你知道另一种方式吗?
谢谢尝试使用搜索查询
这叫做索引
索引使数据库搜索效率更高。用于创建索引
创建索引属性(属性应唯一)一个选项:
MATCH (c)
WHERE id(c) = 72
OPTIONAL MATCH (c)<-[:MANAGEMENT_TEAM]-(from_board)
WITH c, collect(distinct {id:id(from_board), name:from_board.name}) as Management
OPTIONAL MATCH (c)<-[:SHAREHOLDER]-(shareholder)
WITH c, Management, collect(distinct {id:id(shareholder), name:shareholder.name}) as Shareholders
....
RETURN c, Management, Shareholders, ...
感谢@Micheal,您的第二个选项使cypher查询更清晰,现在看起来是这样的:
START c=node({companyId})
OPTIONAL MATCH (c)<-[management_rel:MANAGEMENT_TEAM]-(management)
OPTIONAL MATCH (c)<-[shareholder_rel:SHAREHOLDER]-(shareholder)
OPTIONAL MATCH (c)-[:PRODUCT_OFFERED]->(product)
OPTIONAL MATCH (c)<-[:CUSTOMER]-(customer)-[:CORE_BUSINESS]->(industry_sector)
OPTIONAL MATCH (c)-[:ASSIGNEE]->(patent)
RETURN
c AS company,
collect(distinct({id:id(management), name:management.name, role:management_rel.role})) AS managements,
collect(distinct({id:id(shareholder), name:shareholder.name, percentage:shareholder_rel.percentage })) AS shareholders,
collect(distinct({id:id(product), name:product.name, description:product.description})) AS products,
collect(distinct({id:id(customer), name:customer.name, sector_id:id(industry_sector), sector:industry_sector.name})) AS customers,
collect(distinct({id:id(patent), name:patent.name, title:patent.title, website:patent.website, description:patent.description})) AS patents
START c=node({companyId})
可选匹配(c)(专利)
返回
c作为公司,
收集(不同({id:id(management),name:management.name,role:management\u rel.role}))作为管理,
作为股东收集(不同的({id:id(股东),姓名:股东.name,百分比:股东_rel.percentage})),
将(不同的({id:id(product),name:product.name,description:product.description}))收集为产品,
收集(不同的({id:id(customer),name:customer.name,section_id:id(industry_section),section:industry_section.name}))作为客户,
收集(不同的({id:id(专利),名称:patent.name,title:patent.title,网站:patent.website,description:patent.description}))作为专利
正如您所看到的,请求有更多的连接,就像在“managaments”元组中添加的管理关系一样。RESTAPI在EC2小实例上执行此请求需要183毫秒。
地图创建、distinct和collect的结合非常强大:)顺便说一句,如果我删除返回中的extract函数,我的响应时间将从850ms移动到530ms请详细说明你的答案,给出一些例子来帮助提问者。我想这是thisun告诉我的
MATCH (c)
WHERE id(c) = 72
OPTIONAL MATCH (c)-[r]-(x)
RETURN c,type(r) as type, collect(distinct {id:id(x), name:x.name}) as connected
START c=node({companyId})
OPTIONAL MATCH (c)<-[management_rel:MANAGEMENT_TEAM]-(management)
OPTIONAL MATCH (c)<-[shareholder_rel:SHAREHOLDER]-(shareholder)
OPTIONAL MATCH (c)-[:PRODUCT_OFFERED]->(product)
OPTIONAL MATCH (c)<-[:CUSTOMER]-(customer)-[:CORE_BUSINESS]->(industry_sector)
OPTIONAL MATCH (c)-[:ASSIGNEE]->(patent)
RETURN
c AS company,
collect(distinct({id:id(management), name:management.name, role:management_rel.role})) AS managements,
collect(distinct({id:id(shareholder), name:shareholder.name, percentage:shareholder_rel.percentage })) AS shareholders,
collect(distinct({id:id(product), name:product.name, description:product.description})) AS products,
collect(distinct({id:id(customer), name:customer.name, sector_id:id(industry_sector), sector:industry_sector.name})) AS customers,
collect(distinct({id:id(patent), name:patent.name, title:patent.title, website:patent.website, description:patent.description})) AS patents