neo4j,密码关系存在,关系属性存在于where,order by和limit

Posted

技术标签:

【中文标题】neo4j,密码关系存在,关系属性存在于where,order by和limit【英文标题】:neo4j, cypher relationship exist, relation property exsit with where, order by and limit 【发布时间】:2018-05-23 06:19:22 【问题描述】:

我有一个具有这种模式的 neo4j 数据库 (:User)-[:ANSWER_TO_QUESTION]->(:Question)。

在我的应用程序中有一些问题和一些用户节点。用户将回答问题,而答案将保存用户与问题之间的关系。

用户可以跳过问题,答案将保存 null 与问题的关系。

每个问题都有一个回答周期时间,如果用户回答了问题,则重新提出问题;如果用户没有回答问题,则重新提出问题的无回答周期时间。

现在我想查询特殊用户未提出或未回答且已通过无回答周期或已回答且已通过回答周期的问题。按问题的优先级排序,然后返回一个问题。

我尝试使用联合查询,但我无法返回总结果的限制 1。所以查询将返回 3 个问题,每个联合查询一个。

MATCH (n:Users user_name:$user_name),(q:Questions)
Where NOT (n)-[:ANSWERED_OF_QUESTION]->(q)
return q as question
ORDER BY question.priority DESC 
LIMIT 1
UNION MATCH (n:Users user_name:$user_name)-[r:ANSWERED_OF_QUESTION]->(q:Questions)
Where r.answer is null and r.created+q.no_answer_cycle < $now_time
RETURN q as question
ORDER BY question.priority DESC 
LIMIT 1
UNION MATCH (n:Users user_name:$user_name)-[r:ANSWERED_OF_QUESTION]->(q:Questions
Where r.answer is not null and r.created+q.answer_cycle < $now_time
RETURN q as question
ORDER BY question.priority DESC 
LIMIT 1

我尝试了 OPTIONAL MATCH 和 CASE,但没有得到我的结果。有什么帮助吗?

【问题讨论】:

【参考方案1】:

这样简化怎么样?

MATCH (q:Questions)
WHERE NOT EXISTS ((:Users user_name:$user_name)-[:ANSWERED_OF_QUESTION]->(q))
OPTIONAL MATCH (n:Users user_name:$user_name)-[r:ANSWERED_OF_QUESTION]->(q)
WHERE (r.answer is null and r.created+q.no_answer_cycle < $now_time)
  OR  (r.answer is not null and r.created+q.answer_cycle < $now_time)
RETURN q as question
ORDER BY question.priority DESC
LIMIT 1

【讨论】:

Neo.ClientError.Statement.SyntaxError: 类型不匹配: 预期的关系但为 List (第 2 行,第 24 列(偏移量:107))“不存在((n)-[r ]->(q))" 啊,是的,可变长度模式返回一个列表,我们需要先展开它,请检查编辑并重试。 Neo.ClientError.Statement.SyntaxError: 无效输入“H”:预期“i/I”(第 4 行,第 2 列(偏移量:110))“不存在的地方((n)-[ r]->(q))" 我认为我们不能在展开后使用 where 是的,这个策略是错误的。我放弃了我的上一个答案并用另一种方法进行了编辑,看看它是否有效。【参考方案2】:

我的答案是这样的:

call apoc.cypher.run("MATCH (n:Users user_name:$user_name),(q:Questions)
Where NOT (n)-[:ANSWERED_OF_QUESTION]->(q)
return q as question
ORDER BY question.priority DESC
LIMIT 1 UNION MATCH (n:Users user_name:$user_name)-[r:ANSWERED_OF_QUESTION]->(q:Questions)
Where r.answer is null 
RETURN q as question
ORDER BY question.priority DESC
LIMIT 1
UNION MATCH (n:Users user_name:$user_name)-[r:ANSWERED_OF_QUESTION]->(q:Questions)
Where r.answer is not null 
RETURN q as question
ORDER BY question.priority DESC
LIMIT 1",user_name:"saeed@saeed.com")
yield value
RETURN value
ORDER BY value.question.priority
DESC LIMIT 1'

编辑: 第二种解决方案:灵感来自lokesh

MATCH (q:Questions), (n:Users user_name:$user_name)
OPTIONAL MATCH (n)-[r:ANSWERED_OF_QUESTION]->(q)
WHERE (r.answer is null )
OR  (r.answer is not null )
RETURN q as question
ORDER BY question.priority DESC
LIMIT 1

有什么改进建议吗?

【讨论】:

以上是关于neo4j,密码关系存在,关系属性存在于where,order by和limit的主要内容,如果未能解决你的问题,请参考以下文章

Neo4j 第十一篇:Cypher函数

使用开始/结束日期过滤Neo4j中的关系

在 Cypher 中,如果关系不存在,我该如何创建关系;如果确实如此,请更新属性

Neo4j 创建有数组属性的节点&关系深度

Neo4j 第二篇:图形数据库

NEO4J安装与配置