Neo4j 密码– ;如何通过管道传递变量

Neo4j 密码– ;如何通过管道传递变量,neo4j,cypher,graph-databases,with-clause,Neo4j,Cypher,Graph Databases,With Clause,我有以下疑问: START e1=node:event(prop="0") MATCH e1-[r:rbel]->e2 WITH e1, e2, count(e1) as ecount MATCH e1-[:redge]->p<-[:redge]-e2 WITH p.element_type as Type, p.label as Label, (count(p)*100./ecount) as percentage WHERE percentage > 20 RETUR

我有以下疑问:

START e1=node:event(prop="0")
MATCH e1-[r:rbel]->e2
WITH e1, e2, count(e1) as ecount
MATCH e1-[:redge]->p<-[:redge]-e2
WITH p.element_type as Type, p.label as Label, (count(p)*100./ecount) as percentage
WHERE percentage > 20
RETURN Type, Label, ROUND(percentage) as Percentage
START e1=节点:事件(prop=“0”)
匹配e1-[r:rbel]->e2
将e1、e2、计数(e1)作为ecount
匹配e1-[:redge]>P20
返回类型、标签、四舍五入(百分比)作为百分比
我试图计算指定模式在具有
prop=“0”
的事件中发生的次数占这些事件中发生的所有模式的百分比

我收到以下错误:
未知标识符“ecount”

因此,我将计算中的
ecount
替换为
count(ecount)
,这始终产生了100%的
百分比,我知道这不是真的

我做错了吗?如何将
ecoount
的值携带到
WITH
子句中,并在计算中使用它


感谢您的帮助

这个查询对您有用吗?每当我将
e1
count(e1)
语句组合在一起时,
count(e1)
总是1。我认为这是因为当您选择
e1
时,
count(e1)
聚合也不再起作用。您可以省略
e1
计数(e1)

START e1=节点:事件(prop=“0”)
匹配e1-[r:rbel]->e2
用e1,e2
匹配e1-[:redge]>P20
返回类型、标签、四舍五入(百分比)作为百分比
更新 在使用您提供的控制台设置后,我得到了以下查询:

START e1=node:node_auto_index(prop="0") 
MATCH e1-[r:rbel]->e2 
WITH COLLECT(e2) AS e2collection, count(e1) AS cnt 
MATCH e1-[:redge]->p<-[:redge]-(e2) 
WITH p, COLLECT(e1) AS e1collection, cnt, e2collection 
WITH p.name AS Name, cnt, count(p)*100/cnt AS Percentage 
WHERE Percentage > 20 
RETURN Name, Percentage
START e1=节点:节点自动索引(prop=“0”)
匹配e1-[r:rbel]->e2
使用COLLECT(e2)作为e2collection,将计数(e1)作为cnt
匹配e1-[:redge]>P20
返回名称,百分比

h3nrik的解决方案在下面的控制台设置示例中运行良好,但是,由于某些原因,当应用到我的localhost数据浏览器中的实际数据时,它无法工作。尽管查询速度较慢,但我还是找到了以下解决方法:

START e1=node:event(prop="0") 
MATCH e1-[:rbel]->e2 
WITH count(e1) as ecount
START e1=node:event(prop="0") 
MATCH e1-[:rbel]->e2, e1-[:redge]->p<-[:redge]-(e2)
WITH p.label AS Label, p.element_type as Type, ecount, count(p)*100./ecount AS percentage 
WHERE percentage > 20 
RETURN Label, Type, ROUND(percentage) as Percentage
START e1=节点:事件(prop=“0”)
匹配e1-[:rbel]>e2
以计数(e1)作为ecount
开始e1=节点:事件(prop=“0”)
匹配e1-[:rbel]>e2,e1-[:redge]>p20
返回标签、类型、四舍五入(百分比)作为百分比

您的模式匹配器总是选择三角形关系。我在这里的控制台上创建了一个测试数据集:使用计数器聚合其他节点将始终得到2,如图所示:因此,即使这不是您想要实现的,这个计算基本上是正确的:如果可能,您可以更清楚地描述您的目标,包括数据结构的控制台示例吗?我最初想计算多少节点适合我的第一个匹配:(我创建了一个稍微不同的图,它更类似于我的用例)。这里返回3。那么我想要这个:。这将返回我期望的结果:33%。但是,我必须在计算中手动插入“3”。我认为你的建议是:,这总是给我100%的结果,这是错误的。你知道如何将“3”作为变量携带吗?非常感谢你的帮助!对非常感谢。您知道为什么集合允许您传递变量吗?非常感谢!因为当您不使用集合时,您会分别计算每个可能路径的集合。这将始终导致100%。虽然您的代码在控制台设置中运行良好,但在我的localhost databrowser上无法运行。。我得到:“无效查询:模式的所有部分必须直接或间接连接到至少一个绑定实体。发现这些标识符已断开连接:unname2、unname3、e1、e2、p”您使用哪种版本的Neo4j?
START e1=node:event(prop="0") 
MATCH e1-[:rbel]->e2 
WITH count(e1) as ecount
START e1=node:event(prop="0") 
MATCH e1-[:rbel]->e2, e1-[:redge]->p<-[:redge]-(e2)
WITH p.label AS Label, p.element_type as Type, ecount, count(p)*100./ecount AS percentage 
WHERE percentage > 20 
RETURN Label, Type, ROUND(percentage) as Percentage