neo4j错误,同时避免关系中的循环

时间:2017-09-16 09:09:43

标签: loops neo4j cypher graph-traversal

我有Node Label CUSTOMER,它有一个密钥,CUSTOMER_ID

每个客户ID都链接到其他客户ID,这些双向关系是使用CSV文件创建的。

Graph-Data

我希望所有节点的结果都是以下形式

CUSTOMER_ID, MIN(CUSTOMER_ID) over the set of related nodes
600,600
601,600
602,600
604,600
605,600

总数据中会有许多这样的链接节点(子图) 我能够使用以下查询获得它

MATCH (a:Member_Matching_1) -[r:MATCHED*]-> (b:Member_Matching_1)
WITH DISTINCT a,b
RETURN a.OPTUM_LAB_ID ,min(b.OPTUM_LAB_ID)
order by toInt(min(b.OPTUM_LAB_ID)),ToINT(a.OPTUM_LAB_ID)

但问题是查询会遍历图表过多的不需要的次数

前 -

想要:600 - > 601 - > 602 - > 604

不需要的:600 - > 601 - > 602 - > 603 - > 602 - > 604

由于数据量太高,我想使用最优的查询。

在花了一些时间搜索网络后遇到了一个解决方案

MATCH  p=(a:Member_Matching_1) -[:MATCHED*]-> (b:Member_Matching_1)
WHERE NONE (n IN nodes(p) 
            WHERE size(filter(x IN nodes(p) 
                              WHERE n = x))> 1)
RETURN EXTRACT(n IN NODES(p)| n.OPTUM_LAB_ID) ;

但我面临错误

Neo.DatabaseError.General.UnknownError
key not found:   UNNAMED32

请告知

提前致谢

1 个答案:

答案 0 :(得分:1)

截至今天,Cypher并不是非常适合这类查询,因为它只支持edge uniqueness,但不支持顶点唯一性。有一个proposal in the openCypher language来支持可配置的匹配语义,但它最近才被接受,并没有合并到Neo4j。

目前,对于这种遍历,您最好使用APOC库的apoc.path.expandConfig存储过程。这允许您设置唯一性约束,例如NODE_PATH,强制执行“对于每个返回的节点,从起始节点到它的路径都是唯一的。”

此外,当我遇到类似问题时,我尝试使用以下hack:设置固定的遍历深度并手动指定唯一性约束。这对我的用例来说效果不好,但值得尝试一下。草图代码:

MATCH p=(n)-[*5]->(n)
WHERE nodes(p)[0] <> nodes(p)[2]
  AND nodes(p)[0] <> nodes(p)[4]
  AND nodes(p)[2] <> nodes(p)[4]
RETURN nodes(p)
LIMIT 1

您遇到的错误Neo.DatabaseError.General.UnknownError / key not found: UNNAMED32确实非常奇怪,您的查询似乎过度压缩了导致此(quite unique)错误消息的数据库。

注意:我同意@TomGeudens的评论,声明你不应该两次创建MATCHED边缘 - 只需使用单个方向并在查询中包含边缘的无向性,即使用{{1在Cypher。