如何有效地编码具有多个关系的节点

时间:2016-07-06 21:32:23

标签: neo4j cypher

我有以下数据结构:

  • 订单 - >联系 - >安装 - >运动
  • 订单 - >联系 - >下载 - >运动

我创建了以下Cypher查询:

MATCH (ca1:Campaign) - [CI] - (i:Installs) - [IC] - (co1:Contact) - [CO1] - (o1:Order), 
(ca2:Campaign) - [CD] - (d:Downloads) - [DC] - (co2:Contact) - [CO2] - (o2:Order) 
where i.DownloadDate > '6/1/16' and i.DownloadDate < '7/31/16' 
and d.DownloadDate > '6/1/16' and d.DownloadDate < '7/31/16'
RETURN ca1,CI,i,IC,co1,CO1,o1,ca2,CD,d,DC,co2,CO2,o2 limit 50
CQ正在提供以下警告:

  

此查询在断开连接的模式之间构建笛卡尔积。   如果查询的一部分包含多个断开连接的模式,这将在所有这些部分之间构建笛卡尔积。这可能会产生大量数据并减慢查询处理速度。虽然偶尔有意,但通常可以重新制定避免使用此交叉产品的查询,可能通过在不同部分之间添加关系或使用OPTIONAL MATCH(标识符为:(ca2,d,co2,o2))

有更好的方法在CQL中编码吗? (抱歉新手问题)。 感谢。

2 个答案:

答案 0 :(得分:0)

第一次通过这个,但我猜你正在寻找更像是所有广告系列,这些广告系列的安装/下载,这些安装/下载的联系人以及相关订单,安装或订单日期介于提供的日期之间。那是对的吗?

您现在的查询是所有内容的笛卡尔产品(下载匹配的每一行,在每个可能的组合中,与您订单的每个可能行匹配),当我的猜测是您真正想要的是一个联合与下载和订单匹配,或者如果它们可以被视为相同,则匹配两者的查询。

我的下一个问题是,你真的需要比赛的每一个元素吗?现在,您将返回匹配的每个节点以及每个节点之间的每个关系。您真的需要此查询中的所有信息,还是节点足够?此外,您是否需要完整节点,或者您是否只需要每个节点中的属性?

此外,在您的人际关系中指定标签和方向将是一项巨大的改进,并且可以加快您的查询速度。

假设您需要的只是节点,您可以多态地处理安装和下载节点数据,安装/下载之间的关系标签是相同的,并且可以为您的关系添加标签和方向(请更正我可以解决这些问题,这对你来说可能更好:

MATCH (campaign:Campaign)<-[:Has]-(installOrDownload)<-[:Has]-(contact:Contact)<-[:Has]-(order:Order)
where installOrDownload.DownloadDate > '6/1/16' and installOrDownload.DownloadDate < '7/31/16' 
RETURN campaign, installOrDownload, contact, order limit 50

如果关联标签将您的安装/下载与广告系列相关联,并将联系人与安装/下载链接相同(如果没有相关方法),则installOrDownload将在安装和下载节点上匹配。

答案 1 :(得分:-2)

我不认为您可以为具有多个关系的节点编码,因为默认情况下节点是一夫一妻制的。