我有一个图表,其中我有以下结构:
节点:
- 页面(蓝色)-> 页面附加到 lectureseries 节点和 lecture by ownerof 关系。
- Lecture Series(紫色)-> Lectureseries 通过系列关系连接到 lecture
- 讲座(绿色)-> 如上所述连接到页面和讲座系列的讲座。 lecture 具有 public、follower、private 和 privilege 属性 其中一个讲座,即 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 │
└────┴────────────┘
几点说明:
- 在查询中使用有向边。它不会对性能产生很大影响,但会提高可读性。
- 您不必为以后不使用的变量命名。为此,我删除了
o
和r
变量。 - 根据 Cypher styleguide ,所有关键字都应大写。
- 除非页面与其系列讲座之间有多个
ownerof
边,否则不需要使用DISTINCT
。 - 确保在
WITH
子句中携带节点n
,否则您将在以下匹配中获得一个新的n
变量 (谢谢 InverseFalcon。)
关于java - Neo4j 密码查询 : Sum the results of two queries,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40689878/