Neo4j 查询以获取给定节点集的所有节点

Neo4j 查询以获取给定节点集的所有节点,neo4j,cypher,Neo4j,Cypher,我有要查询的公司度量数据 ---------------------------------------------------- |Metrics | Year | Qtr | Department | Value| ---------------------------------------------------- |Revenue| 2017 | Q1 | Dep1 | 2000045| |Revenue

我有要查询的公司度量数据

   ----------------------------------------------------
   |Metrics |   Year |   Qtr |   Department  |   Value|
   ----------------------------------------------------
   |Revenue|     2017  |  Q1 |     Dep1 |        2000045|
   |Revenue|     2017  |  Q2 |     Dep1 |        2000046|
   |Revenue|     2017  |  Q2 |     Dep2 |        2000047|
   |Revenue|     2017  |  Q3 |     Dep2 |        2000048|
   |Revenue|     2017  |  Q3 |     Dep3 |        2000049|
   |Sales  |     2017  |  Q1 |     Dep1 |        2000041|
   |Sales  |     2017  |  Q1 |     Dep2 |        2000052|
   |Sales  |     2017  |  Q2 |     Dep1 |        2000053|
   ----------------------------------------------------- 
现在我对上述数据进行如下建模

年份、Qtr和部门作为节点,如

(d:DIM{name:“2012”,“type:“year”)

值与节点类似

(v:VALUE{VALUE:2000053})

和度量作为关系,如

(d:DIM{name:“2012”,“type:“year”)-[:REVENUE]->(v:VALUE{VALUE:2000053})

因此,对于每个记录,可能有三个与值节点的关系

现在是查询部分:

给定维度,查询应获得值,如给定年份2017,Qtr q1应返回与此过滤器对应的值。如果我添加Dep 1,则它应进一步过滤结果

我试过一些问题,比如

Match (d:DIM)-[:REVENUE]->(v:VALUE)
where d.name in ["2017","q1"]
Return d,v
但这个查询提供了2017年和第一季度的联合,而不是我要寻找的交叉点


此外,我可能会使用类型属性进行分组。

有几种方法可以做到这一点。虽然我个人建议对年份、Qtr和部门使用单独的节点标签(也可能是指标),但我会使用您当前的模型

交集所需的部分是ALL()谓词,它对值列表进行操作。在这种情况下,我们将收集所有匹配:DIM节点。为了使匹配有效,我们希望从列表的第一项匹配到
v
节点,然后确保
v
连接到列表中的其余项(比从所有:值节点进行过滤更快)

或者,如果已安装,则可以使用交叉口功能:

match (d:DIM)-[:REVENUE]->(v)
where d.name in ["2017","q1"]
with d, collect(v) as values
with collect(d) as dims, collect(values) as allValues // list of lists
with dims, reduce(inter = head(allValues), values in tail(allValues) | apoc.coll.intersection(inter, values)) as values
return dims, values
编辑

我想起了另一种可能更快的方法。请尝试一下:

with ["2017","q1"] as dimInput
with dimInput, size(dimInput) as dimCnt
match (d:DIM)
where d.name in dimInput
match (d)-[:REVENUE]->(v)
with v, dimCnt, count(distinct d) as cnt
where dimCnt = cnt
return v

你需要更详细地解释你的算法。你能给出一个最小的、可验证的数据示例,你想要的结果,以及你已经尝试过的内容吗?(查询返回的值是多少?)详细解释数据模型和使用的查询。
with ["2017","q1"] as dimInput
with dimInput, size(dimInput) as dimCnt
match (d:DIM)
where d.name in dimInput
match (d)-[:REVENUE]->(v)
with v, dimCnt, count(distinct d) as cnt
where dimCnt = cnt
return v