Collections Neo4j中的并集和计数集合
我的简单数据库包含相互链接的“术语”和“代码”节点。 有两种类型的关系 “术语”和“代码”之间的关系称为:代码和是无向的(或在两个方向上读取相等)。 “术语”之间的关系称为:NT(意思是狭义术语)和直接的 我想从上到下遍历所有的“术语”,收集所有唯一的代码并计算它们 这是我的疑问:Collections Neo4j中的并集和计数集合,collections,neo4j,cypher,union,intersection,Collections,Neo4j,Cypher,Union,Intersection,我的简单数据库包含相互链接的“术语”和“代码”节点。 有两种类型的关系 “术语”和“代码”之间的关系称为:代码和是无向的(或在两个方向上读取相等)。 “术语”之间的关系称为:NT(意思是狭义术语)和直接的 我想从上到下遍历所有的“术语”,收集所有唯一的代码并计算它们 这是我的疑问: MATCH (a)-[:NT*]->(b), (a)-[:CODE]-(c), (b)-[:CODE]-(d) WHERE a.btqty = 0 RETURN a.termid AS termid, a.ma
MATCH (a)-[:NT*]->(b), (a)-[:CODE]-(c), (b)-[:CODE]-(d)
WHERE a.btqty = 0
RETURN a.termid AS termid, a.maxlen AS maxlen, COUNT(DISTINCT c.code) + COUNT(DISTINCT d.code) AS total, COLLECT(DISTINCT c.code) + COLLECT(DISTINCT d.code) AS codes
ORDER BY termid;
这就是我得到的:
termid maxlen total codes
22 2 3 ["S70","S43","S70"]
25 4 9 ["S20","S21","S54","S61","S63","S63","S21","S61","S54"]
26 2 9 ["S99","S98","S29","S13","S13","S20","S29","S14","S15"]
68 5 13 ["S38","S11","S12","S11","S12","S38","S37","S21","S36","S22","S98","S63","S58"]
123 2 3 ["S38","S12","S12"]
154 2 2 ["S58","S58"]
155 4 3 ["S63","S62","S63"]
159 2 2 ["S36","S36"]
...
我需要清除集合中的重复项,并按如下方式正确计数:
termid maxlen total codes
22 2 2 ["S43","S70"]
25 4 5 ["S20","S21","S54","S61","S63"]
26 2 7 ["S99","S98","S29","S13","S20","S14","S15"]
68 5 10 ["S38","S11","S12","S37","S21","S36","S22","S98","S63","S58"]
123 2 2 ["S38","S12"]
154 2 1 ["S58"]
155 4 2 ["S63","S62"]
159 2 1 ["S36"]
...
我认为这是关于REDUCE函数的应用,但我不知道如何使用它
谢谢你的帮助 你说得对,这可以用
REDUCE
解决。在reduce中,您需要检查累加器中是否已经存在当前元素,并有条件地修改它:
MATCH (a)-[:NT*]->(b), (a)-[:CODE]-(c), (b)-[:CODE]-(d)
WHERE a.btqty = 0
WITH a.termid AS termid, a.maxlen AS maxlen,
REDUCE(uniqueCodes=[],
x in COLLECT(DISTINCT c.code) + COLLECT(DISTINCT d.code) |
CASE WHEN x IN uniqueCodes THEN uniqueCodes ELSE uniqueCodes+x END
) AS codes
ORDER BY termid
RETURN termid, maxlen, count(codes) as total, codes
非常感谢!现在我知道REDUCE是如何工作的了。顺便说一句,从长度(代码)到总计数(代码)。非常感谢你!!!