Neo4j 非常慢的关系创建查询

Neo4j 非常慢的关系创建查询,neo4j,cypher,neo4jclient,Neo4j,Cypher,Neo4jclient,我需要将“应用程序”类型的节点与在安装应用程序的系统上创建的用户连接 通常,“应用程序”安装在集群对(2个系统)上,并且只有默认系统作为属性“n.system” “应用程序”有一个命名模式:,例如yxz12345或ab23456等 每个系统上都创建了用户帐户(有时每个系统上最多创建100个)。其中一些具有类似“应用程序”的命名模式:,例如sdjhg12345或tzrw23456等。一些没有 “应用程序”作为“用户”属性,可包含其运行的用户u.Name=n.User,或使用前缀right(u.Na

我需要将“应用程序”类型的节点与在安装应用程序的系统上创建的用户连接

通常,“应用程序”安装在集群对(2个系统)上,并且只有默认系统作为属性“n.system”

“应用程序”有一个命名模式:
,例如yxz12345或ab23456等

每个系统上都创建了用户帐户(有时每个系统上最多创建100个)。其中一些具有类似“应用程序”的命名模式:
,例如sdjhg12345或tzrw23456等。一些没有

“应用程序”作为“用户”属性,可包含其运行的用户
u.Name=n.User
,或使用前缀
right(u.Name,5)=right(n.Name,5)
后具有相同5位数字的所有“用户”

用户名在所有系统中共享,因此我们只需要链接相同系统上的用户

我正在使用以下查询创建关系:

MATCH (n:Application {Id: 1})
WITH n
MATCH (s:System)-[:ClusteredWith]-(c:System)
WHERE s.Name = n.System
WITH n, s, c
MATCH (u:User)
WHERE 
    ((u)-[:CreatedOn]->(s) OR (u)-[:CreatedOn]->(c))
AND
    (u.Name = n.User OR right(u.Name, 5) = right(n.Name, 5))

CREATE UNIQUE (u)-[:UsedFor]->(n)
neo4j数据库目前有8000个系统、100000个用户和30000个应用程序

我已经在Id、名称、用户上建立了自动属性索引

在非常强大的硬件(高达96 GB RAM等)上,此查询速度非常慢。 我使用的是Neo4jClient版本1.0.0.646和Neo4j 2.0.1

如何快速获取此查询

编辑:添加的查询计划:

==> EmptyResult(_rows=0, _db_hits=0)
==> UpdateGraph(commands=[{"action": "CreateUnique", "identifiers": ["u", "n", "  UNNAMED305"]}], _rows=0, _db_hits=0)
==>   Eager(_rows=0, _db_hits=0)
==>     Filter(pred="((nonEmpty(PathExpression((u)-[  UNNAMED165:CreatedOn]->(s), true)) OR nonEmpty(PathExpression((u)-[  UNNAMED196:CreatedOn]->(c), true))) AND (Property(u,Name(0)) == Property(n,User(33)) OR RightFunction(Property(u,Name(0)),Literal(5)) == RightFunction(Property(n,Name(0)),Literal(5))))", _rows=0, _db_hits=29774466)
==>       NodeByLabel(identifier="u", _db_hits=0, _rows=4962411, label="User", identifiers=["u"], producer="NodeByLabel")
==>         ColumnFilter(symKeys=["n", "c", "s", "  UNNAMED58"], returnItemNames=["n", "s", "c"], _rows=183, _db_hits=0)
==>           Filter(pred="(Property(s,Name(0)) == Property(n,System(36)) AND hasLabel(s:System(0)))", _rows=183, _db_hits=366)
==>             SimplePatternMatcher(g="(c)-['  UNNAMED58']-(s)", _rows=183, _db_hits=4880)
==>               NodeByLabel(identifier="c", _db_hits=0, _rows=2915, label="System", identifiers=["c"], producer="NodeByLabel")
==>                 Filter(pred="Property(n,Id(0)) == Literal(1)", _rows=1, _db_hits=702)
==>                   NodeByLabel(identifier="n", _db_hits=0, _rows=702, label="Application", identifiers=["n"], producer="NodeByLabel")
这是一个针对2个系统上的应用程序的查询,但没有匹配的用户(当前)

分析您的查询()并查看执行计划,同时牢记以下内容:

  • :应用程序(Id)
    是否唯一
  • 比较需要多少数据库点击次数
    :应用程序(系统)=:系统(名称)
    ?通过关联
    (:Application)-[:InstalledOn]->(:System)
    ,可以完全避免这些问题吗
  • 您是否在
    处绑定了重复的路径/结果项,其中包含n、s、c
    • ~模式
      (s:System)-[:ClusteredWith]-(c:System)
      是对称的
    • ~重复表示查询的其余部分执行多次

  • 匹配了多少用户?是否正在使用索引?这可能不是因为
    WHERE
    子句很复杂,可能太复杂了,引擎无法重构到精确的查找。您是否可以重构它以允许初始索引查找,或者更好地,通过
    (:System)批量更新来访问用户总是有点慢。您可能想尝试一下周期提交语句。它最近在2.1.0.M1中发布。只有数据库的初始重建是“批量”导入,我会尝试一下。。但在正常操作过程中(新应用程序不太常见),速度很慢,有时会超时,感谢您的帮助。我添加了当前的查询计划,下周我将尝试您的建议。您也可以发布您的索引配置(neo4j浏览器中的
    :schema
    ,neo4j shell中的
    schema
    ),从执行计划来看,似乎没有使用任何索引。您是对的:==>没有索引==>=>没有约束为什么,启用自动索引时?您可能正在使用传统索引,而不是新的基于标签的架构索引(也是“自动的”)。查看并获取有关模式索引的信息。您的建议非常有用,现在运行速度非常快。我添加了Neo4j 2.0索引,并重写了查询以使用类似于您的示例的关系。
    MATCH (app:Application {Id: 1})
    MATCH (:System {Name:app.System})-[:ClusteredWith*0..1]-(sys:System)<-[:CreatedOn]-(user)
    WHERE  (user.Name = app.User OR right(user.Name, 5) = right(app.Name, 5))
    CREATE UNIQUE (user)-[:UsedFor]->(app)