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