java - Neo4j 密码查询 : Sum the results of two queries

标签 java neo4j cypher

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

Sample graph

节点:

  1. 页面(蓝色)-> 页面附加到 lectureseries 节点和 lecture by ownerof 关系。
  2. Lecture Series(紫色)-> Lectureseries 通过系列关系连接到 lecture
  3. 讲座(绿色)-> 如上所述连接到页面和讲座系列的讲座。 lecture 具有 public、follower、private 和 privilege 属性 其中一个讲座,即 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

结果:

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
  • 确保在 WITH 子句中携带节点 n,否则您将在以下匹配中获得一个新的 n 变量 (谢谢 InverseFalcon。)

关于java - Neo4j 密码查询 : Sum the results of two queries,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40689878/

相关文章:

java - neo4j 替代路径

facebook - 像Facebook一样在neo4j中提供的 friend 建议以及相关数据排名

neo4j - 查找 2 个日期之间的所有事件

neo4j - 返回 cypher 中关系列表的开始和结束节点

java - Eclipse Kepler RTC 插件上的 IBM SecureRandom

java - 将用户对象存储在与 Spring Security 的 session 中

c# - Neo4jClient 加载索引

neo4j - 在 Neo4j 中为每个查询返回前 n 个结果

java - 遍历名称以 "get"开头的所有方法 - 比较对象

java - ReactFX EventStreams 和重播行为?