Neo4j等效:选择节点A的前2000,返回节点A及其相关节点

时间:2018-02-20 21:50:41

标签: c# sql-server neo4j cypher

在前面,请原谅我。我通常是一个潜伏者,它已经花了我一切来实际注册一个帐户并提出这个问题......显然我无法弄清楚正确的单词搜索给我所需的答案。

TL; DR - 我需要使用参数查询给定节点类型的数据库,将节点类型结果限制为2000,同时还包括相关节点(但不限于2000)。

我将首先讲述我是如何达到这一点的,希望我可能先走错路了......

我编写了一个位于关系数据库(SQL Server)之上的外汇交易程序。使用我的软件的客户端不断要求跨多个表的数据之间的关系越来越难。我知道图形数据库和节点关系的设置方式似乎与我在程序中需要的结果与SQL服务器提供给我的结果一致。

我已经启动了一个试验计划,看看我是否可以将原始软件从SQL服务器移动到Neo4j。在SQL服务器中,我会有一个包含市场数据的表,第二个表包含来自市场数据的派生数据,两者之间有重复数据,以便建立关系(这不是最好的方法,但我不能不要把这个重复的数据区域的客户说出来。

我在Neo4j中将此数据建模为“出价”节点和“询问”节点。两个节点都包含市场数据。然后将这些节点馈送到“市场信息”节点,该节点具有其中的派生数据。所以“[出价] - > [市场信息]< - [问]”。

我没有创建一个包含“Bid”和“Ask”数据的“市场信息”节点的原因是因为“Bid”和“Ask”数据也会在多个数据间隔内提供。基节点长度为5分钟,但程序需要5,15,30,60分钟(以及更多)。我的想法是“市场信息”节点将是父节点,我可以根据有多少个子节点来改变节点的间隔(5分钟市场信息节点将包含1个Bid和1个Ask节点,其中as 60分钟市场信息节点将包含12个Bid节点和12个Ask节点。

在SQL Server中,每个间隔类型都有自己的表。所以我有5分钟的桌子,15分钟的桌子,30分钟的桌子等等。它可能只是一张桌子,但这不是这里讨论的内容。我可以轻松查询一个表,选择前2000行,按日期排序并继续我的快乐方式。

在Neo4j中,我可以查询MarketInfo节点并将结果限制为2000,但我还需要返回相关的Bid和Ask节点。我开始沿着这条道路前进:

MATCH (a:MarketInfo {Pair: 'AUD/CAD'})-[r]-(b)
RETURN r, a, b 
ORDER BY a.EndTicksUTC desc
LIMIT 2000

哪个会返回相关节点,但我无法控制市场信息节点应该被限制的内容,而不是相关的节点数。

我要求的太多了吗?我愿意接受任何建议,即使答案是“你不应该使用图形数据库......”。当我添加不同的节点类型并通过程序的不同级别建立关系时,这个数据库将变得更加复杂。只是糟透了,我在这个程序的肉和土豆部分有这种问题。我这个懒惰的开发人员告诉我创建一个特定于时间间隔的MarketInfo节点,但我认为这已经远离了这个问题而且我将在未来的道路上继续解决这个问题......

1 个答案:

答案 0 :(得分:2)

首先匹配所有MarketInfo个节点,然后与每个MarketInfo节点匹配所有紧邻的节点。

MATCH (a:MarketInfo {Pair: 'AUD/CAD'})
WITH a
ORDER BY a.EndTicksUTC DESC 
LIMIT 2000
MATCH (a)-[r]-(b) 
RETURN a, r, b