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

Neo4j 如何高效地为具有多个关系的节点编码,neo4j,cypher,Neo4j,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 >

我有以下数据结构:

  • 订单->联系->安装->活动
  • 订单->联系->下载->活动
我创建了以下密码查询:

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
匹配(ca1:活动)-[CI]-[i:安装)-[IC]-[co1:联系)-[co1]-[o1:订单),
(ca2:活动)-[CD]-(d:下载)-[DC]-(co2:联系)-[co2]-(o2:订单)
其中i.DownloadDate>'6/1/16'和i.DownloadDate<'7/31/16'
d.DownloadDate>'6/1/16'和d.DownloadDate<'7/31/16'
返回ca1、CI、i、IC、co1、co1、o1、ca2、CD、d、DC、co2、co2、o2限值50
CQ发出以下警告:

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

有没有更好的方法用CQL编码?。(很抱歉问你这个新手问题)。
谢谢。

由于默认情况下节点是一夫一妻制的,因此我认为您无法为具有多个关系的节点编码。

首先考虑一下这一点,但我猜您要做的是更像所有活动、这些活动的安装/下载、这些安装/下载的联系人以及相关订单,安装或订购日期介于提供的日期之间。对吗

您的查询是所有内容的笛卡尔乘积(下载匹配的每一行,针对订单匹配的每一行的每一个可能组合),我猜您真正想要的是匹配与下载和订单的结合,或者如果它们可以被视为相同,一个对这两者都匹配的查询

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

此外,在关系上指定标签和方向将是一个巨大的改进,应该可以加快查询速度

假设您所需要的只是节点,您可以以多态方式处理安装和下载节点数据,安装/下载之间的关系标签相同,并尝试向关系添加标签和方向(请更正这些标签和方向,以便我可以修复),这可能对您更有效:

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

MATCH(campaign:campaign)我很困惑,你的查询让我觉得你的路径中缺少一个逗号,应该是“->campaign,Order->”,表示不同的路径,而不是“->campaign Order->Contact”。如果是这样的话,看起来你真正拥有的是订单->联系人,然后联系人与活动有安装和下载关系。你是对的。。第一次战役结束时应该有一个逗号。我把它分成两行。波斯特合并成一行。实际上,Contact连接到两个节点(安装和下载),然后再连接回活动节点。好的,这很有帮助。您能否清楚地说明您希望查询执行的操作(口头描述而不是尝试查询),并提供任何附加信息,例如您是否通过id或其他方式从某些节点开始,或者您是否希望数据库中的所有匹配项都使用此信息?另外,您能解释一下为什么下载和安装是两个不同的节点吗?我觉得你可能可以在这里优化一些东西,但还不确定。你能更详细地解释一下你想要达到的结果吗?你描述的两条不同的路径没有很好地解释图表,因为它没有捕捉到这两条路径是如何相互作用的。我们可以看一个样本图的截图吗?在大多数其他网站上,我会用双关语+1你。不过我不在这里,抱歉。谢谢你的好主意。也将降低复杂性。我试试看。