Performance Neo4J:带过滤器的三级展开节点

Performance Neo4J:带过滤器的三级展开节点,performance,neo4j,cypher,Performance,Neo4j,Cypher,对于新POC,我有以下用例: 对于给定的节点,执行3级展开,但同时在所有展开的节点上应用筛选器(意味着我要针对某些属性筛选所有结果节点) 测试集: 节点:~1700万 边缘:约4000万 房地产:约26.5亿 我的第一个解决方案如下所示: MATCH path=(startNode:Entity {id:'RVDJRcV_yfXbG0-syGKp3Q..'})-[*..3]-(endNode:Entity) WITH path WHERE ALL (n IN nodes(path)[1.

对于新POC,我有以下用例:

对于给定的节点,执行3级展开,但同时在所有展开的节点上应用筛选器(意味着我要针对某些属性筛选所有结果节点)

测试集:

  • 节点:~1700万
  • 边缘:约4000万
  • 房地产:约26.5亿
我的第一个解决方案如下所示:

MATCH path=(startNode:Entity {id:'RVDJRcV_yfXbG0-syGKp3Q..'})-[*..3]-(endNode:Entity) 
WITH path 
WHERE ALL (n IN nodes(path)[1..] 
WHERE n.key = '1' AND n.domain = 'facebook.com' AND n.investigationID='any') 
RETURN path 
LIMIT 100
这可以完成任务,但速度不是很快。我的测试集中的平均查询时间为2-3秒,但有许多超时(时间>30秒)。我假设问题在于路径处理,我的节点有很多属性

解释计划:

变体1:我删除了“with path”

解决方案: 基于我在查询中应该避免[1..]的提示

MATCH path=(startNode:Entity {id:'v-jXIO7kozAa35gMUpUkvg..'})-[*..3]-(endNode:Entity) 
WHERE ALL (n IN nodes(path)
WHERE n=startNode OR (n.key = '1' AND n.domain = 'facebook.com' AND n.investigationID='any')) 
RETURN path 
LIMIT 100

虽然您可以在扩展过程中使用可变长度路径进行筛选,但当您使用列表的一部分而不是整个列表时,Cypher当前无法在扩展过程中应用该筛选。它将退回到执行完整的var长度扩展,然后对找到的所有结果应用过滤器

我们只需要在节点(路径)中使用
ALL(n)…
,我们不能使用路径的切片

为此,我们需要在all()函数中再添加一个谓词。由于开始节点可能不满足当前谓词,我们将为其创建一个异常:

MATCH path=(startNode:Entity {id:'RVDJRcV_yfXbG0-syGKp3Q..'})-[*..3]-(endNode:Entity) 
WHERE ALL (n IN nodes(path)[1..] 
 WHERE n=startNode OR (n.key = '1' AND n.domain = 'facebook.com' AND n.investigationID='any')) 
RETURN path 
LIMIT 100

能否给出查询的密码
explain
?匹配和WHERE之间的
with
会在匹配和筛选之间创建一个逻辑分段,因此密码规划器无法优化匹配,因此您需要在WHERE可以优化之前删除该行。请在测试该更改后重新发布解释。如果我对于“With PATH”,它只是稍微好一点。等等,你是说你应该还是不应该使用
[1..]
?(因为它仍然在cypher示例中)。将使用
ALL(n在尾部(节点(路径))而不是head异常哪里…
起作用?或者计划会认为这仍然是在分割路径吗?实际上,让我们先试试其他方法,我可能忽略了一些小但重要的东西。在您描述的查询中,尝试从查询中删除带有路径的
,您可能会看到一个巨大的变化。