Neo4j 组合来自多个密码匹配语句的结果

Neo4j 组合来自多个密码匹配语句的结果,neo4j,cypher,Neo4j,Cypher,我正在尝试合并由以下三个匹配条件之一返回的任何节点: (p)-[:HAS_CAL]->(prodCal:ProdCal)-[:DELIVERS_TO]->(:Country {name: "USA"}) (p)-[:HAS_CAL]->(prodCal:ProdCal)-[:DELIVERS_TO]->(z:ZipCode {zipCode: delivZip}) (p)-[:HAS_CAL]->(prodCal:ProdCal)-[:DELIVERS_TO]-&g

我正在尝试合并由以下三个匹配条件之一返回的任何节点:

(p)-[:HAS_CAL]->(prodCal:ProdCal)-[:DELIVERS_TO]->(:Country {name: "USA"})
(p)-[:HAS_CAL]->(prodCal:ProdCal)-[:DELIVERS_TO]->(z:ZipCode {zipCode: delivZip})
(p)-[:HAS_CAL]->(prodCal:ProdCal)-[:DELIVERS_TO]->(zr:ZipRange) where zr.fromZip >= delivZip or zr.thruZip <= delivZip
我试过几种方法,但都不能成功。最终结果应该是一组
delivedday
s,它们由每个
match(prodCal)-[dd:DELIVERS]->(delivedday:Day).
语句返回

更新:

我似乎有一个有效的解决方案:

...
with p, delivZip
optional match (p)-[:HAS_CAL]->(prodCal1:ProdCal)-[:DELIVERS_TO]->(z:ZipCode {zipCode: delivZip})
with p, delivZip, prodCal1
optional match (p)-[:HAS_CAL]->(prodCal2:ProdCal)-[:DELIVERS_TO]->(zr:ZipRange) where zr.fromZip >= delivZip or zr.thruZip <= delivZip
with p, collect(prodCal1) + collect(prodCal2) as prodCals
optional match(p)-[:HAS_CAL]->(prodCal3:ProdCal)-[:DELIVERS_TO]->(:Country {name: "USA"})
with collect(prodCal3) + prodCals as prodCals2
unwind prodCals2 as cal
match (cal)-[dd:DELIVERS]->(delivDay:Day) where dd.cutoff > (timestamp() / 1000)
return delivDay
。。。
用p,zip
可选匹配(p)-[:HAS_-CAL]->(prodCal1:ProdCal)-[:DELIVERS_-TO]->(z:ZipCode{ZipCode:deliverzip})
带有p、ZIP、prodCal1
可选匹配(p)-[:HAS_-CAL]->(prodCal2:ProdCal)-[:DELIVERS_-TO]->(zr:ZipRange),其中zr.fromZip>=deliverzip或zr.thruZip(prodCal3:ProdCal)-[:DELIVERS_-TO]->(:Country{name:“USA”})
使用collect(prodCal3)+prodCals作为prodcal2
将prodCals2作为cal展开
匹配(cal)-[dd:DELIVERS]->(DeliverDay:Day),其中dd.cutoff>(timestamp()/1000)
回程日
我很想知道是否有更优雅的解决方案。

带p,zip
WITH p, delivZip
MATCH (p) - [:HAS_CAL] -> (prodCal:ProdCal)
WHERE (prodCal) - [:DELIVERS_TO] -> (:Country {name: "USA"})
OR (prodCal) -[:DELIVERS_TO] -> (:ZipCode {zipCode: delivZip})
OR ANY( path IN (prodCal) - [:DELIVERS_TO] -> (:ZipRange) WHERE delivZip >= LAST(NODES(path))['fromZip'] AND delivZip <= LAST(NODES(path))['thruZip'] )
WITH prodCal
MATCH (prodCal)-[dd:DELIVERS]->(delivDay:Day) WHERE dd.cutoff > (TIMESTAMP() / 1000)
RETURN delivDay
匹配(p)-[:HAS_CAL]->(prodCal:prodCal) WHERE(prodCal)-[:deliver_TO]->(:Country{name:“USA”}) 或者(prodCal)-[:将_传递到]->(:ZipCode{ZipCode:deliverzip}) 或者(prodCal)中的任何(路径)-[:DELIVERS_TO]->(:ZipRange),其中delivezip>=LAST(节点(路径))['fromZip']和delivezip(deliveday:Day),其中dd.cutoff>(TIMESTAMP()/1000) 回程日

优雅当然是一种主观属性,但这避免了担心收集/释放的花招,你可以避免意外的
NULL
结果导致的错误,而且它的性能会更高。如果你可以选择重构,我会替换那些
:ZipRange
n与单个
节点有关系的ODE:ZipCode
节点;即使您必须建立100000个关系,这也在容量范围内,并将简化您的所有查询。

谢谢您的回答!我正在尝试理解
或任何(p IN(prodCal)-[:DELIVERS_to]->(:ZipRange)其中deliverZip>=LAST(nodes(p))['fromZip']deliverZip=LAST(NODES(p))['fromZip']
)?啊。因此,括号内的语句所做的是遍历与模式匹配的每个路径
path
,然后针对每个路径,检查路径
path
LAST(NODES(path))
,即
:ZipRange
节点中的最后一个节点是否为表示
deliverZIP
下降的范围。如果该模式至少有一条路径通过此筛选器,则
ANY
的计算结果为
True
,您的
prodCal
将在结果行中传递。(固定变量名以减少混淆)。哦,太酷了!关于创建
:为
ZipRange
节点所代表的每个邮政编码传递到
关系的另一点,这不会有效地使
ProdCal
节点成为超级节点吗?我认为,例如,从单个节点产生80000到100000个关系是一种糟糕的做法?为了进一步说明我的担忧,这是一种经常出现的查询模式,必须尽可能快。我认为这主要是旧版本遗留下来的一篇信条,当然,从3.0.YMMV开始,我就没有观察到关系数远高于此的问题。我明白了,我必须对这两种模式进行试验,看看如何再次感谢你的帮助。
WITH p, delivZip
MATCH (p) - [:HAS_CAL] -> (prodCal:ProdCal)
WHERE (prodCal) - [:DELIVERS_TO] -> (:Country {name: "USA"})
OR (prodCal) -[:DELIVERS_TO] -> (:ZipCode {zipCode: delivZip})
OR ANY( path IN (prodCal) - [:DELIVERS_TO] -> (:ZipRange) WHERE delivZip >= LAST(NODES(path))['fromZip'] AND delivZip <= LAST(NODES(path))['thruZip'] )
WITH prodCal
MATCH (prodCal)-[dd:DELIVERS]->(delivDay:Day) WHERE dd.cutoff > (TIMESTAMP() / 1000)
RETURN delivDay