Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Join 如何改进Cypher中的多连接查询_Join_Neo4j_Cypher - Fatal编程技术网

Join 如何改进Cypher中的多连接查询

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

我正在寻找在我的密码查询中进行某种多重连接的最佳方法。我找到了一个解决方案,但对我来说似乎有点太复杂了。 此查询的目标是从第一个节点开始,通过多种类型的关系从与第一个节点相关的许多其他节点检索id和“name”属性(参见下文)

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