Neo4J查询最常见的关系

时间:2019-10-17 18:21:22

标签: neo4j cypher

我正在研究信息学,目前正在从事一个项目。我必须选择一种NOSQL数据结构并自己研究。我选择了Graph数据库,并做了一个小项目来展示自己的技能。我必须基于关系数据库在Neo4J中建立一个数据库。

该项目着重于您可以使用并放回安特卫普市不同站点的自行车。大多数大城市都有的东西。我的数据库中有3种类型的节点。首先,有游乐设施。游乐设施由rideId,startTime,endtime,startLockId和endLockId组成。然后是可以放自行车的车站。每次骑行都有一个开始锁和一个结束锁。因此,这些节点之间也有两种关系。一辆车离开的地方,另一辆到达的地方。车站由lockId,街道和号码(门牌号码)组成。每个站都位于安特卫普的某个地区。地区仅由一个名称组成。数据库中共有7个区。

我必须写一些查询来展示我在Neo4J上的技能,但是我找不到。问题问:“哪个区之间的游乐设施最多?”。

当前,我来到此查询,其中列出了所有游乐设施的起点和终点:

MATCH (d1:District)<--(s1:Station)<--(r:Ride)-->(s2:Station)-->(d2:District) 
WHERE d1.Name <> d2.Name 
RETURN d1, d2

我一直在搜索Internet,并且一直在尝试使用COUNT(),ORDER BY()和COLLECT()方法,但是似乎找不到解决方案,或者离它更近。有谁知道我如何计算区域之间最常见的关系?

1 个答案:

答案 0 :(得分:0)

您的查询看起来差不多了,您正在寻找的模式是正确的。

您将需要一个更好的谓词,以确保您不会获得镜像结果(相同的区对的结果,只需切换将哪个绑定到d1以及将哪个绑定到d2)。您可以通过对地区的图形ID添加限制:WHERE id(d1) < id(d2)来做到这一点。这也将避免返回相同区域的路径。

您需要使用count()作为乘车次数,然后对结果进行排序,然后获得您感兴趣的许多结果。

MATCH (d1:District)<--(:Station)<--(r:Ride)-->(:Station)-->(d2:District) 
WHERE id(d1) < id(d2) 
RETURN d1, d2, count(r) as rideCount
ORDER BY rideCount DESC
LIMIT 5