Neo4J -如何汇总不同跳距上的关系值

pjngdqdw  于 2022-11-05  发布在  其他
关注(0)|答案(2)|浏览(241)

在Neo4J中玩了一段时间后,我遇到了以下问题:
我有一个Neo4J数据库,其中只存储了一个节点类型和一个关系类型。节点和关系具有不同的属性,但它们与我的问题无关:
为了更好地理解,我对我的问题进行了一个小版本的建模:

注:虚线事务值不包括在相应的查询中,因为它们不是源自新节点。

是否有一种方法可以在一个查询中对不同跃点距离的所有关系值求和,并按属性对它们进行分组?
我知道如何通过3个不同的查询来实现这一点,每个查询对应一个距离,但我是否可以将这3个查询合并为1个高效查询

MATCH (a:Node {is_capital_letter: 'True'})
<-[t1]-
(b:Node {is_new: 'True'})
RETURN a.capital_letter, sum(t1.value)

MATCH (a:Node {is_capital_letter: 'True'})
<-[t1]-()
<-[t2]-
(b:Node {is_new: 'True'})
RETURN a.capital_letter, sum(t2.value)

MATCH (a:Node{is_capital_letter: 'True'})
<-[t1]-()
<-[t2]-()
<-[t3]-
(b:Node {is_new: 'True'})
RETURN a.capital_letter, sum(t3.value)

是否可以在一个查询(按capital_letter分组)中获得所有sum(t1.value)sum(t2.value)sum(t3.value)
编辑:CREATE语句以重现上面的示例:

CREATE (a:Node {is_capital_letter: "True", capital_letter: "A"})
CREATE (b:Node {is_capital_letter: "True", capital_letter: "B"})
CREATE (n0:Node {is_new: "True"})
CREATE (n1:Node {is_new: "True"})
CREATE (n2:Node {is_new: "True"})
CREATE (n3:Node {is_new: "True"})
CREATE (n4:Node {is_new: "True"})
CREATE (n5:Node {is_new: "False"})
CREATE (n6:Node {is_new: "True"})
CREATE (n7:Node {is_new: "True"})
CREATE (n8:Node {is_new: "False"})
CREATE (n9:Node {is_new: "True"})
CREATE (n10:Node {is_new: "True"})
CREATE (n11:Node {is_new: "True"})
CREATE (n0)-[:TRANSACTIONS {value: 0}]->(a)
CREATE (n1)-[:TRANSACTIONS {value: 1}]->(a)
CREATE (n2)-[:TRANSACTIONS {value: 2}]->(a)
CREATE (n3)-[:TRANSACTIONS {value: 3}]->(a)
CREATE (n4)-[:TRANSACTIONS {value: 4}]->(a)
CREATE (n5)-[:TRANSACTIONS {value: 5}]->(a)
CREATE (n6)-[:TRANSACTIONS {value: 6}]->(n5)
CREATE (n7)-[:TRANSACTIONS {value: 7}]->(n4)
CREATE (n7)-[:TRANSACTIONS {value: 4}]->(n5)
CREATE (n8)-[:TRANSACTIONS {value: 8}]->(n3)
CREATE (n9)-[:TRANSACTIONS {value: 9}]->(n8)
CREATE (n10)-[:TRANSACTIONS {value: 1}]->(b)
CREATE (n11)-[:TRANSACTIONS {value: 2}]->(b)
ryevplcw

ryevplcw1#

MATCH p=(a:Node {is_capital_letter:"True"})<-[:TRANSACTIONS*0..2]-(:Node)<-[r:TRANSACTIONS]-(:Node {is_new:"True"}) 
RETURN sum(r.value), a.capital_letter, length(p)

应屈服:

╒══════════════╤══════════════════╤═══════════╕
│"sum(r.value)"│"a.capital_letter"│"length(p)"│
╞══════════════╪══════════════════╪═══════════╡
│10            │"A"               │1          │
├──────────────┼──────────────────┼───────────┤
│9             │"A"               │3          │
├──────────────┼──────────────────┼───────────┤
│17            │"A"               │2          │
├──────────────┼──────────────────┼───────────┤
│3             │"B"               │1          │
└──────────────┴──────────────────┴───────────┘
ih99xse1

ih99xse12#

如果您只需要一个查询(而不是提高性能),则可以使用WITH合并查询。

MATCH (a:Node {is_capital_letter:"True"})<-[t1:TRANSACTIONS]-(b:Node {is_new:"True"})
WITH a, sum(t1.value) AS oneHopSum
OPTIONAL MATCH (a)<-[]-()<-[t2]-(:Node {is_new:"True"})
WITH a, oneHopSum, sum(t2.value) AS twoHopsSum
OPTIONAL MATCH (a)<-[]-()<-[]-()<-[t3]-(:Node {is_new:"True"})
RETURN a, oneHopSum, twoHopsSum, sum(t3.value) AS threeHopsSum

这将产生:

╒═════════════════════════════════════════════════╤═══════════╤════════════╤══════════════╕
│"a"                                              │"oneHopSum"│"twoHopsSum"│"threeHopsSum"│
╞═════════════════════════════════════════════════╪═══════════╪════════════╪══════════════╡
│{"is_capital_letter":"True","capital_letter":"A"}│10         │17          │9             │
├─────────────────────────────────────────────────┼───────────┼────────────┼──────────────┤
│{"is_capital_letter":"True","capital_letter":"B"}│3          │0           │0             │
└─────────────────────────────────────────────────┴───────────┴────────────┴──────────────┘

相关问题