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
Java 如何提高变长Neo4j密码查询的性能?_Java_Neo4j_Cypher - Fatal编程技术网

Java 如何提高变长Neo4j密码查询的性能?

Java 如何提高变长Neo4j密码查询的性能?,java,neo4j,cypher,Java,Neo4j,Cypher,我正在Java Spring引导应用程序中查询Neo4j,使用连接到bolt端口,但我的查询大约需要30分钟才能返回结果 查询: MATCH path=(:JAVA {snapshot: 3})-[*]->() UNWIND nodes(path) as n WITH DISTINCT n SET n.scope = 'JAVA' RETURN n.ID 我曾尝试在网上搜索优化技术以及APOC函数,但迄今为止,我没有尝试改善性能。标签被编入索引。快照是存在于所有节点上的属性,ID是一个独

我正在Java Spring引导应用程序中查询Neo4j,使用连接到bolt端口,但我的查询大约需要30分钟才能返回结果

查询:

MATCH path=(:JAVA {snapshot: 3})-[*]->()
UNWIND nodes(path) as n
WITH DISTINCT n
SET n.scope = 'JAVA'
RETURN n.ID
我曾尝试在网上搜索优化技术以及APOC函数,但迄今为止,我没有尝试改善性能。标签被编入索引。快照是存在于所有节点上的属性,ID是一个独立的标识,因为不相关的原因而需要它

图形信息

  • 200K节点
  • 355K关系
  • 9073个JAVA类型的节点
  • 61K从JAVA类型的节点传出的直接关系
  • dbms.memory.heap.initial_size=3G
  • dbms.memory.heap.max_size=4G
  • dbms.memory.pagecache.size=1G
我实际上是在尝试遍历一个程序调用链,其中链的起点是JAVA类型的节点。如果任何其他节点都可以从JAVA类型的节点访问,那么我想设置它的作用域并返回它的ID。我想发生的是,图中有很多常见的路径遍历,并且查询多次遍历同一路径。我不确定我是否能够防止这种情况,或者Neo4j是否在内部处理了这个问题

我从Java访问驱动程序(驱动程序在应用程序启动时实例化),执行查询并从结果中收集ID

try(最终会话=getDriver().Session()){
session.run(新语句(“”).stream()
.map(record->Long.valueOf(record.get(0).asLong())
.collect(Collectors.toList());
...
编辑、跟进评论中的问题,并提供更多数据。 具有JAVA标签的节点的不同依赖项

MATCH (:JAVA {snapshot: 3})-[*]->(n) RETURN count(DISTINCT n)
返回182749

查询计划概要


我们当然可以测试这种分析

请记住,在这里展开路径节点的使用肯定是无效的,即使路径的所有结束节点都不同,也会有大量重复,因为子路径中的任何节点都会出现在从该子路径延伸的路径中

查询的更好版本是:

MATCH path=(:JAVA {snapshot: 3})-[*]->(n)
WITH DISTINCT n
SET n.scope = 'JAVA'
RETURN n.ID
但是如果有多条路径指向同一个节点(如果您检查了该查询的概要文件计划,发现在执行不同操作后与之前的行之间存在相当大的差距)那么这似乎是一个使用的好例子,因为我们可以将它们配置为使用遍历唯一性行为,该行为在所有扩展中只应访问任何不同的节点一次

如果您的查询由于反复访问相同的节点和路径而挂起,那么这应该是一个帮助

试试这个:

MATCH (start:JAVA {snapshot: 3})
CALL apoc.path.subgraphNodes(start, {relationshipFilter:'>'}) YIELD node as n
WITH n
SKIP 1 // so we don't apply this to the start node
SET n.scope = 'JAVA'
RETURN n.ID

我们当然可以检验这种分析

请记住,在这里展开路径节点的使用肯定是无效的,即使路径的所有结束节点都不同,也会有大量重复,因为子路径中的任何节点都会出现在从该子路径延伸的路径中

查询的更好版本是:

MATCH path=(:JAVA {snapshot: 3})-[*]->(n)
WITH DISTINCT n
SET n.scope = 'JAVA'
RETURN n.ID
但是如果有多条路径指向同一个节点(如果您检查了该查询的概要文件计划,发现在执行不同操作后与之前的行之间存在相当大的差距)那么这似乎是一个使用的好例子,因为我们可以将它们配置为使用遍历唯一性行为,该行为在所有扩展中只应访问任何不同的节点一次

如果您的查询由于反复访问相同的节点和路径而挂起,那么这应该是一个帮助

试试这个:

MATCH (start:JAVA {snapshot: 3})
CALL apoc.path.subgraphNodes(start, {relationshipFilter:'>'}) YIELD node as n
WITH n
SKIP 1 // so we don't apply this to the start node
SET n.scope = 'JAVA'
RETURN n.ID

根据您的第一个建议删除“放松”似乎可以将时间缩短到约11分钟。仍然不理想,但效果要好得多。我尝试了apoc子图函数,但35分钟后我结束了查询,不确定问题是什么。这很有趣。
n
有多少个匹配项?
匹配(:JAVA{snapshot:3})-[*]->(n)RETURN count(DISTINCT n)
我们可以看到成功查询的配置文件计划吗?这可能会提供线索。我用查询的计数和配置文件更新了我的问题。这非常奇怪,行(节点)和DISTINCT节点之间的差异非常大…大约4.39亿对18.2万。子图()是调用应该已经产生了显著的改进,因为它应该在遍历过程中显著地修剪它需要访问的路径。您有空闲的内存吗?如果有,您可以将pagecache大小增加到4或5 gb,并查看是否有类似的时间安排吗?我想知道是否要更改它(或者堆)稍微有点帮助。根据您的第一个建议删除“放松”似乎可以将时间缩短到约11分钟。仍然不理想,但效果要好得多。我尝试了apoc子图函数,但35分钟后我结束了查询,不确定问题是什么。这很有趣。您获得了多少个匹配项?
匹配(:JAVA{snapshot:3})-[*]->(n) RETURN count(DISTINCT n)
我们可以看到成功查询的配置文件计划吗?这可能会提供线索。我用查询的计数和配置文件更新了我的问题。这非常奇怪,行(节点)和DISTINCT节点之间的差异非常大…大约4.39亿对18.2万。子图()是调用应该已经产生了显著的改进,因为它应该在遍历过程中显著地修剪它需要访问的路径。您有空闲的内存吗?如果有,您可以将pagecache大小增加到4或5 gb,看看是否看到类似的计时?我想知道稍微更改一下这个(或者堆)是否有帮助。