Neo4j 将独立查询与
我有两个单独的操作:Neo4j 将独立查询与,neo4j,cypher,Neo4j,Cypher,我有两个单独的操作: MATCH ()<-[r:waitsFor]-() SET r.active = true WITH子句用于将返回的信息“结转”到查询的另一部分。在Neo4j中使用WITH null作为none并向前执行后续匹配容易受到笛卡尔乘积创建的影响。根据节点的数量,笛卡尔积爆炸可能是巨大的,需要花费大量时间 因此,如果第一个查询中的“r”在第二个查询中是缩小匹配范围所必需的,那么您应该使用WITH r。由于情况似乎并非如此(因为您将null用作none),因此这可能
MATCH ()<-[r:waitsFor]-()
SET r.active = true
WITH子句用于将返回的信息“结转”到查询的另一部分。在Neo4j中使用WITH null作为none并向前执行后续匹配容易受到笛卡尔乘积创建的影响。根据节点的数量,笛卡尔积爆炸可能是巨大的,需要花费大量时间 因此,如果第一个查询中的“r”在第二个查询中是缩小匹配范围所必需的,那么您应该使用WITH r。由于情况似乎并非如此(因为您将null用作none),因此这可能不是解决方案
在我看来,您的案例似乎在按顺序执行两个独立的查询。你应该看看这个条款。它用于连接两个查询并合并它们的结果。您拥有的选项是纯旧的
UNION
或UNION ALL
(删除重复项)。不要这样做。正如您所说,它们是独立的查询,所以请分别运行它们。按照现在运行它们的方式,第二个查询将对第一个查询中的每个匹配结果执行一次。我现在正在处理的一个小型本体图中的一个示例,有146个节点标记为:OwlClass
。考虑下面两个查询
-查询1-
MATCH (c:OwlClass)
RETURN COUNT(*)
MATCH (c:OwlClass)
WITH null as n
MATCH (d:OwlClass)
RETURN COUNT(*)
MATCH (c:OwlClass)
WITH COUNT(c) as count_c
MATCH (d:OwlClass)
RETURN count_c, COUNT(d) as count_d
结果:
COUNT(*)
146
Returned 1 row in 102 ms
COUNT(*)
21316
Returned 1 row in 734 ms
count_c count_d
146 146
Returned 1 row in 153 ms
执行计划:
==> ColumnFilter(symKeys=[" INTERNAL_AGGREGATE01b2d10b-7bf4-43b4-a67d-fbe826c7a4dd"], returnItemNames=["COUNT(*)"], _rows=1, _db_hits=0)
==> EagerAggregation(keys=[], aggregates=["( INTERNAL_AGGREGATE01b2d10b-7bf4-43b4-a67d-fbe826c7a4dd,CountStar())"], _rows=1, _db_hits=0)
==> NodeByLabel(label="OwlClass", identifier="c", _rows=146, _db_hits=0)
==> ColumnFilter(symKeys=[" INTERNAL_AGGREGATEe33d15c7-e357-4e32-9f7f-3fbc00dd58f6"], returnItemNames=["COUNT(*)"], _rows=1, _db_hits=0)
==> EagerAggregation(keys=[], aggregates=["( INTERNAL_AGGREGATEe33d15c7-e357-4e32-9f7f-3fbc00dd58f6,CountStar())"], _rows=1, _db_hits=0)
==> NodeByLabel(label="OwlClass", identifier="d", _rows=21316, _db_hits=0)
==> ColumnFilter(symKeys=["c", "n"], returnItemNames=["n"], _rows=146, _db_hits=0)
==> Extract(symKeys=["c"], exprKeys=["n"], _rows=146, _db_hits=0)
==> NodeByLabel(label="OwlClass", identifier="c", _rows=146, _db_hits=0)
==> ColumnFilter(symKeys=["count_c", " INTERNAL_AGGREGATE17be6af7-abbb-4ef7-8250-ff050d6ba7c6"], returnItemNames=["count_c", "count_d"], _rows=1, _db_hits=0)
==> EagerAggregation(keys=["count_c"], aggregates=["( INTERNAL_AGGREGATE17be6af7-abbb-4ef7-8250-ff050d6ba7c6,Count(d))"], _rows=1, _db_hits=0)
==> NodeByLabel(label="OwlClass", identifier="d", _rows=146, _db_hits=0)
==> ColumnFilter(symKeys=[" INTERNAL_AGGREGATE67abdc54-9c44-4353-bf82-e4aff895141e"], returnItemNames=["count_c"], _rows=1, _db_hits=0)
==> EagerAggregation(keys=[], aggregates=["( INTERNAL_AGGREGATE67abdc54-9c44-4353-bf82-e4aff895141e,Count(c))"], _rows=1, _db_hits=0)
==> NodeByLabel(label="OwlClass", identifier="c", _rows=146, _db_hits=0)
-查询2-
MATCH (c:OwlClass)
RETURN COUNT(*)
MATCH (c:OwlClass)
WITH null as n
MATCH (d:OwlClass)
RETURN COUNT(*)
MATCH (c:OwlClass)
WITH COUNT(c) as count_c
MATCH (d:OwlClass)
RETURN count_c, COUNT(d) as count_d
结果:
COUNT(*)
146
Returned 1 row in 102 ms
COUNT(*)
21316
Returned 1 row in 734 ms
count_c count_d
146 146
Returned 1 row in 153 ms
执行计划:
==> ColumnFilter(symKeys=[" INTERNAL_AGGREGATE01b2d10b-7bf4-43b4-a67d-fbe826c7a4dd"], returnItemNames=["COUNT(*)"], _rows=1, _db_hits=0)
==> EagerAggregation(keys=[], aggregates=["( INTERNAL_AGGREGATE01b2d10b-7bf4-43b4-a67d-fbe826c7a4dd,CountStar())"], _rows=1, _db_hits=0)
==> NodeByLabel(label="OwlClass", identifier="c", _rows=146, _db_hits=0)
==> ColumnFilter(symKeys=[" INTERNAL_AGGREGATEe33d15c7-e357-4e32-9f7f-3fbc00dd58f6"], returnItemNames=["COUNT(*)"], _rows=1, _db_hits=0)
==> EagerAggregation(keys=[], aggregates=["( INTERNAL_AGGREGATEe33d15c7-e357-4e32-9f7f-3fbc00dd58f6,CountStar())"], _rows=1, _db_hits=0)
==> NodeByLabel(label="OwlClass", identifier="d", _rows=21316, _db_hits=0)
==> ColumnFilter(symKeys=["c", "n"], returnItemNames=["n"], _rows=146, _db_hits=0)
==> Extract(symKeys=["c"], exprKeys=["n"], _rows=146, _db_hits=0)
==> NodeByLabel(label="OwlClass", identifier="c", _rows=146, _db_hits=0)
==> ColumnFilter(symKeys=["count_c", " INTERNAL_AGGREGATE17be6af7-abbb-4ef7-8250-ff050d6ba7c6"], returnItemNames=["count_c", "count_d"], _rows=1, _db_hits=0)
==> EagerAggregation(keys=["count_c"], aggregates=["( INTERNAL_AGGREGATE17be6af7-abbb-4ef7-8250-ff050d6ba7c6,Count(d))"], _rows=1, _db_hits=0)
==> NodeByLabel(label="OwlClass", identifier="d", _rows=146, _db_hits=0)
==> ColumnFilter(symKeys=[" INTERNAL_AGGREGATE67abdc54-9c44-4353-bf82-e4aff895141e"], returnItemNames=["count_c"], _rows=1, _db_hits=0)
==> EagerAggregation(keys=[], aggregates=["( INTERNAL_AGGREGATE67abdc54-9c44-4353-bf82-e4aff895141e,Count(c))"], _rows=1, _db_hits=0)
==> NodeByLabel(label="OwlClass", identifier="c", _rows=146, _db_hits=0)
-查询3-
MATCH (c:OwlClass)
RETURN COUNT(*)
MATCH (c:OwlClass)
WITH null as n
MATCH (d:OwlClass)
RETURN COUNT(*)
MATCH (c:OwlClass)
WITH COUNT(c) as count_c
MATCH (d:OwlClass)
RETURN count_c, COUNT(d) as count_d
结果:
COUNT(*)
146
Returned 1 row in 102 ms
COUNT(*)
21316
Returned 1 row in 734 ms
count_c count_d
146 146
Returned 1 row in 153 ms
执行计划:
==> ColumnFilter(symKeys=[" INTERNAL_AGGREGATE01b2d10b-7bf4-43b4-a67d-fbe826c7a4dd"], returnItemNames=["COUNT(*)"], _rows=1, _db_hits=0)
==> EagerAggregation(keys=[], aggregates=["( INTERNAL_AGGREGATE01b2d10b-7bf4-43b4-a67d-fbe826c7a4dd,CountStar())"], _rows=1, _db_hits=0)
==> NodeByLabel(label="OwlClass", identifier="c", _rows=146, _db_hits=0)
==> ColumnFilter(symKeys=[" INTERNAL_AGGREGATEe33d15c7-e357-4e32-9f7f-3fbc00dd58f6"], returnItemNames=["COUNT(*)"], _rows=1, _db_hits=0)
==> EagerAggregation(keys=[], aggregates=["( INTERNAL_AGGREGATEe33d15c7-e357-4e32-9f7f-3fbc00dd58f6,CountStar())"], _rows=1, _db_hits=0)
==> NodeByLabel(label="OwlClass", identifier="d", _rows=21316, _db_hits=0)
==> ColumnFilter(symKeys=["c", "n"], returnItemNames=["n"], _rows=146, _db_hits=0)
==> Extract(symKeys=["c"], exprKeys=["n"], _rows=146, _db_hits=0)
==> NodeByLabel(label="OwlClass", identifier="c", _rows=146, _db_hits=0)
==> ColumnFilter(symKeys=["count_c", " INTERNAL_AGGREGATE17be6af7-abbb-4ef7-8250-ff050d6ba7c6"], returnItemNames=["count_c", "count_d"], _rows=1, _db_hits=0)
==> EagerAggregation(keys=["count_c"], aggregates=["( INTERNAL_AGGREGATE17be6af7-abbb-4ef7-8250-ff050d6ba7c6,Count(d))"], _rows=1, _db_hits=0)
==> NodeByLabel(label="OwlClass", identifier="d", _rows=146, _db_hits=0)
==> ColumnFilter(symKeys=[" INTERNAL_AGGREGATE67abdc54-9c44-4353-bf82-e4aff895141e"], returnItemNames=["count_c"], _rows=1, _db_hits=0)
==> EagerAggregation(keys=[], aggregates=["( INTERNAL_AGGREGATE67abdc54-9c44-4353-bf82-e4aff895141e,Count(c))"], _rows=1, _db_hits=0)
==> NodeByLabel(label="OwlClass", identifier="c", _rows=146, _db_hits=0)
--
自下而上阅读执行计划。本例中的相关部分是行数如何变化。比较查询2和查询3的粗略解释
查询2
OwlClass
的所有节点。现在有146个匹配的模式李>
OwlClass
获取所有节点,继续每个模式。现在有146*146=21316个匹配模式李>
OwlClass
的所有节点。现在有146个匹配的模式李>
OwlClass
获取所有节点,继续每个模式。现在有146个匹配的模式你的意思是用r表示
,而不是用null表示none
表示?不,我不想把任何东西带到第二个查询中。你的第一个语句非常可疑,你真的没有这个关系连接到的任何起点或标签吗?它是简化的测试模型(5k节点,2k:关系的waitsFor).你能简单地解释一下最后一个执行计划吗?请从头至尾阅读。首先获取标签为OwlClass
的所有节点。现在有146个匹配的模式。通过将n设置为null来继续每个模式。通过使用labelOwlClass
获取所有节点,继续每个模式。现在有146*146=21316个匹配模式。数一数,把这些加起来。现在有一种模式(计数)。返回它。如果为null,则由于none不会更改基数,因此必须将结果折叠/聚合为较小的基数