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
Graph 如何在neo4j中优化此查询?_Graph_Neo4j_Graph Databases_Neo4j Apoc - Fatal编程技术网

Graph 如何在neo4j中优化此查询?

Graph 如何在neo4j中优化此查询?,graph,neo4j,graph-databases,neo4j-apoc,Graph,Neo4j,Graph Databases,Neo4j Apoc,我有一个单向图。 结构如下: 图中约有20000个节点。 我提出最简单的请求:MATCH(b1)-[:NEXT_BAR*10]->(b2)返回b1.id,b2.id限制5 请求处理得很快 但是如果我增加关系的数量,查询需要更长的时间来处理。换句话说,速度取决于关系的数量。 此请求需要5分钟以上才能完成:MATCH(b1)-[:NEXT_BAR*10000]->(b2)返回b1.id,b2.id限制5 这仍然是一个简化版本。请求可以有两个以上的节点,并且关系的数量仍然可以是一个范围 如何优化具有

我有一个单向图。 结构如下:

图中约有20000个节点。
我提出最简单的请求:
MATCH(b1)-[:NEXT_BAR*10]->(b2)返回b1.id,b2.id限制5

请求处理得很快

但是如果我增加关系的数量,查询需要更长的时间来处理。换句话说,速度取决于关系的数量。
此请求需要5分钟以上才能完成:
MATCH(b1)-[:NEXT_BAR*10000]->(b2)返回b1.id,b2.id限制5

这仍然是一个简化版本。请求可以有两个以上的节点,并且关系的数量仍然可以是一个范围

如何优化具有大量关系的查询?
也许还有其他图形数据库管理系统不存在这样的问题?

查询的时间和内存复杂度都是指数级的

如果
R
是每个节点合适关系的平均数量,
D
是搜索的深度,那么复杂度是
O(R**D)
。这种复杂性将存在于任何DBMS中。

查询具有指数级的时间和内存复杂性


如果
R
是每个节点合适关系的平均数量,
D
是搜索的深度,那么复杂度是
O(R**D)
。这种复杂性在任何数据库管理系统中都会存在。

这里的理论很简单,但在查询执行中有一些复杂之处

-[:NEXT_BAR*10000]
匹配一条路径,该路径的边大小正好为10000,因此查询引擎会花费一些时间来查找这些路径。另一件需要提及的事情是,在
(b1)-[…]->(b2)
中,
b1
b2
是不特定的,这意味着查询引擎必须缩放所有节点。如果有限制,是的,scall all应该返回有限数量的项目。整个执行过程还取决于变长路径实现的效率

以下几点可能会有所帮助:

  • 从特定节点开始是否可行
  • 如果有分支,唯一的希望是积极过滤,因为指数复杂性(正如cybersam所解释的)
  • 在变量expand中使用较小的数字或范围,例如,
    [NEXT_BAR*.10000]
    。在这种情况下,查询引擎将匹配任何大小不超过10000的路径(不同的语义,但可能适用)
  • *
    表示DFS执行类型。另一方面,这可能是正确的方法。(免责声明:我是联合创始人兼首席技术官)也支持
下面是我用来生成数据并将数据导入Memgraph的Python脚本。通过使用小型
节点\u no
,您可以快速注意到执行模式

导入mgclient
#与数据库建立连接。
connection=mgclient.connect(
host='127.0.0.1',
端口=7687,
sslmode=mgclient.MG\u sslmode\u REQUIRE)
connection.autocommit=True
cursor=connection.cursor()
#清理并设置数据库实例。
cursor.execute(“”“匹配(n)分离删除n;”)
cursor.execute(“”“在:节点(id);“”)上创建索引”)
#导入数据集。
节点数量=10
#创建节点。
对于范围(0,节点编号)中的标识符:
cursor.execute(““”创建(:节点{id:“%s”});”%identifier)
#创建边。
对于范围(1,节点编号)中的标识符:
cursor.execute(“”)
匹配(开始节点:节点{id:“%s”})
匹配(结束节点:节点{id:“%s”})
创建(开始\u节点)-[:下一个\u条]->(结束\u节点);
“”“%(标识符-1,标识符))

这里的理论很简单,但在查询执行中有一些复杂之处

-[:NEXT_BAR*10000]
匹配一条路径,该路径的边大小正好为10000,因此查询引擎会花费一些时间来查找这些路径。另一件需要提及的事情是,在
(b1)-[…]->(b2)
中,
b1
b2
是不特定的,这意味着查询引擎必须缩放所有节点。如果有限制,是的,scall all应该返回有限数量的项目。整个执行过程还取决于变长路径实现的效率

以下几点可能会有所帮助:

  • 从特定节点开始是否可行
  • 如果有分支,唯一的希望是积极过滤,因为指数复杂性(正如cybersam所解释的)
  • 在变量expand中使用较小的数字或范围,例如,
    [NEXT_BAR*.10000]
    。在这种情况下,查询引擎将匹配任何大小不超过10000的路径(不同的语义,但可能适用)
  • *
    表示DFS执行类型。另一方面,这可能是正确的方法。(免责声明:我是联合创始人兼首席技术官)也支持
下面是我用来生成数据并将数据导入Memgraph的Python脚本。通过使用小型
节点\u no
,您可以快速注意到执行模式

导入mgclient
#与数据库建立连接。
connection=mgclient.connect(
host='127.0.0.1',
端口=7687,
sslmode=mgclient.MG\u sslmode\u REQUIRE)
connection.autocommit=True
cursor=connection.cursor()
#清理并设置数据库实例。
cursor.execute(“”“匹配(n)分离删除n;”)
cursor.execute(“”“在:节点(id);“”)上创建索引”)
#导入数据集。
节点数量=10
#创建节点。
对于范围(0,节点编号)中的标识符:
cursor.execute(““”创建(:节点{id:“%s”});”%identifier)
#创建边。
对于范围(1,节点编号)中的标识符:
cursor.execute(“”)
匹配(开始节点:节点{id:“%s”})
匹配(结束节点:节点{id:“%s”})
创建(开始\u节点)-[:下一个\u条]->(结束\u节点);
“”“%(标识符-1,标识符))

你到底想做什么?您正在尝试查找链中的最后一个节点吗?您是否正在尝试在n跳深的链中查找特定节点?是其他原因吗?我想找到节点的组合