我有Node Label CUSTOMER,它有一个密钥,CUSTOMER_ID
每个客户ID都链接到其他客户ID,这些双向关系是使用CSV文件创建的。
我希望所有节点的结果都是以下形式
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
请告知
提前致谢
答案 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。