我对Neo4J和Cypher还是很陌生,我必须处理一个高度相关的数据集。图模型看起来像这样
在我的数据中,我有C,A,Le的多个实例,只有Lo,R,F的几个实例。
我正在寻找一种方法来获取以下内容:对于Lo-F的每个唯一对,获取所有C并计算每个这样的对有多少个唯一C。
换句话说,我希望所有C
和LO
共享相同的所有F
组,我需要我的结果告诉我:
C
我谦虚的开始是MATCH
这样的模式(箭头的方向与该问题无关)
MATCH (c:C)--(:A)--(le:LE)--(:R)--(f:F),
(le)--(lo:LO)
RETURN f, lo, c LIMIT 5
将返回所有匹配的模式。然后,我尝试使用collect
和count
。例如,
MATCH (c:C)--(:A)--(le:LE)--(:R)--(f:F),
(le)--(lo:LO)
RETURN f, lo, collect(c), COUNT(*) as _counts
ORDER BY _counts LIMIT 5
这似乎给了我一张具有唯一f-lo对的表格以及C
列表以及计数。但是,collect(c)
列重复了C
,因此_counts
是不正确的。然后,我尝试介绍DISTINCT
:
MATCH (c:C)--(:A)--(le:LE)--(:R)--(f:F),
(le)--(lo:LO)
RETURN f, lo, collect(DISTINCT c), COUNT(*) as _counts
ORDER BY _counts LIMIT 5
但是我有相同的结果...
我已经在Google上进行了广泛的搜索,但是由于我对SQL还是很陌生,因此我发现大多数教程和示例在其SQL类目中都很难遵循。
此外,将其更好地构建为聚类算法会更好吗?我已经安装了algo
插件,但是我很难理解如何为.stream
方法准备匹配项。
答案 0 :(得分:0)
你很近。这应该为您工作:
MATCH (c:C)<--(:A)-->(le:LE)-->(:R)-->(f:F),
(le)-->(lo:LO)
WITH f, lo, COLLECT(DISTINCT c) AS cs
RETURN f, lo, cs, SIZE(cs) as _counts
ORDER BY _counts LIMIT 5
还请注意,在查询中包括关系方向性会更有效。