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

java - Neo4j Cypher查询:对两个查询的结果求和-LMLPHP

节点:


Page(BLUE)->页面通过关系所有者连接到演讲系列节点和演讲。
讲座系列(PURPLE)->讲座系列通过关联关系连接到讲座
讲座(GREEN)->讲座已连接到如上所述的页面和讲座系列。讲座具有公共,追随者,私有和特权的属性
讲座之一,即lect1通过特权级连接到用户。
用户(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


结果:

name    lecturecount

java    2 (lect3, lect4)


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

我试过这个查询:

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


结果:

name    lecturecount

java    2

java    1


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

我进行了很多搜索,最终找到了UNION子句,但这无济于事。

新问题:

如何将结果总结为

seriesname  lecturecount             seriescount    lecturecount

java    2                      AS      2             3
dotnet  1

最佳答案

我根据您的身材制作了一个示例数据集。 (提示:您可以从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)


查询:

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


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

结果:

╒════╤════════════╕
│name│lecturecount│
╞════╪════════════╡
│java│3           │
└────┴────────────┘


一些注意事项:


在查询中使用有向边。它不会对性能产生很大的影响,但是会提高可读性。
您不必命名以后不使用的变量。因此,我删除了or变量。
根据Cypher styleguide,所有关键字均应为大写。
除非页面与其讲座系列之间有多个ownerof边,否则不需要使用DISTINCT
确保在n子句中携带节点WITH,否则在以下匹配项中将获得新的n变量(感谢InverseFalcon。)

关于java - Neo4j Cypher查询:对两个查询的结果求和,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40689878/

10-10 04:20