Neo4j Cypher 查询:将两个查询的结果相加

Var*_*ika 1 java neo4j cypher

我有一个图表,其中具有以下结构:

示例图

节点:

  1. 页面(蓝色)-> 页面附加到讲座系列节点和讲座的 ownerof 关系。
  2. Lecture Series (紫色)-> Lectureseries 通过系列关系连接到讲座
  3. 讲座(绿色)-> 讲座连接到如上所述的页面和讲座系列。讲座具有公共、追随者、私人和特权等属性 讲座之一,即 lect1 通过特权连接到用户。
  4. 用户(RED)(此处命名为 Ann) - 通过以下关系和上述 1 个讲座连接到页面。

初始条件:

我们必须始终向用户展示所有公众和关注者的讲座,因为我们有完美的查询,没有问题,我们可以得到所需的结果。

MATCH
  (o:page{name:'engg'})-[r:ownerof]-(n:lectureseries)-[s:seriesof]-(l:lecture)
WHERE l.privacy='public' or l.privacy='follower'
RETURN DISTINCT n.name as name,n.series_name as title, COUNT(l) AS lecturecount
Run Code Online (Sandbox Code Playgroud)

结果:

name    lecturecount

java    2 (lect3, lect4)
Run Code Online (Sandbox Code Playgroud)

问题:现在,我们必须将那些讲座添加到计数中,如果特权讲座通过关系特权连接到用户

我试过这个查询:

OPTIONAL MATCH (o:page {name:'engg'})-[r:ownerof]-(n:lectureseries)-[s:seriesof]-(l:lecture)
WHERE l.privacy='public' or l.privacy='follower'
RETURN DISTINCT n.name as name, COUNT(l) AS lecturecount
UNION
OPTIONAL MATCH (o:page {name:'engg'})-[r:ownerof]-(n:lectureseries)-[s:seriesof]-(l:lecture)-[:privileged]-(u:user {name:'Ann'})
RETURN DISTINCT n.name as name, COUNT(l) AS lecturecount
Run Code Online (Sandbox Code Playgroud)

结果:

name    lecturecount

java    2

java    1
Run Code Online (Sandbox Code Playgroud)

但结果应该是一行:java, 3

我搜索了很多,最终找到了该UNION条款,但这没有帮助。

新问题:

如何总结结果为

seriesname  lecturecount             seriescount    lecturecount

java    2                      AS      2             3
dotnet  1
Run Code Online (Sandbox Code Playgroud)

Gab*_*yas 5

我根据你的图制作了一个示例数据集。(提示:您可以从 Neo4j Web UI 导出 CSV 并将其包含在问题中。)

CREATE
  (lect1:lecture {name:"lect1"}),
  (lect3:lecture {name:"lect3", privacy: "public"}),
  (lect4:lecture {name:"lect4", privacy: "follower"}),
  (lect5:lecture {name:"lect5"}),
  (engg:page {name:"engg"}),
  (Ann:user {name:"Ann"}),
  (java:lectureseries {series_name:"java"}),
  (engg)-[:ownerof]->(lect1),
  (engg)-[:ownerof]->(lect3),
  (engg)-[:ownerof]->(lect4),
  (engg)-[:ownerof]->(lect5),
  (Ann)-[:follows]->(engg),
  (Ann)-[:privileged]->(lect1),
  (java)-[:seriesof]->(lect1),
  (java)-[:seriesof]->(lect3),
  (java)-[:seriesof]->(lect4),
  (java)-[:seriesof]->(lect5),
  (engg)-[:ownerof]->(java)
Run Code Online (Sandbox Code Playgroud)

询问:

MATCH (:page {name:'engg'})-[:ownerof]->(n:lectureseries)
OPTIONAL MATCH (n)-[:seriesof]->(l1:lecture)
WHERE l1.privacy='public' or l1.privacy='follower'
WITH n, COUNT(l1) as lecturecount1
OPTIONAL MATCH (n)-[:seriesof]->(l2:lecture)<-[:privileged]-(:user{name:'Ann'})
RETURN n.series_name as name, lecturecount1 + COUNT(l2) AS lecturecount
Run Code Online (Sandbox Code Playgroud)

WITH构造允许您将查询链接在一起。

结果:

???????????????????
?name?lecturecount?
???????????????????
?java?3           ?
???????????????????
Run Code Online (Sandbox Code Playgroud)

几点说明:

  • 在查询中使用有向边。它在性能方面没有很大的影响,但它提高了可读性。
  • 您不必命名以后不使用的变量。出于这个原因,我删除了or变量。
  • 根据 Cypher styleguide,所有关键字都应该大写。
  • 除非您ownerof在页面与其讲座系列之间有多个边缘,否则不需要使用DISTINCT.
  • 确保您nWITH子句中携带节点,否则您将n在以下匹配中获得一个新变量(感谢 InverseFalcon。)