如果第二部分不起作用,Cypher查询将不返回任何内容

时间:2018-06-04 12:10:19

标签: neo4j cypher

我有一个查询,它假设要连接两个结果并将union作为输出。

MATCH (:Some )-[r*0..1]-> (p:Address) WITH collect(p) AS rows1
MATCH (:Some2)-[r*0..1]-> (pp:Address) 
WITH  rows1+collect(pp) AS rows2 
UNWIND rows2 AS row RETURN  row

如您所见,选择分为两部分。因此,如果两个查询都有匹配的数据,那么它可以正常工作,但如果匹配的第二部分没有返回任何内容,则返回空。含义MATCH (:Some2)-[r*0..1]-> (pp:Address)返回空,然后整个联合失败并返回null,即使MATCH (:Some )-[r*0..1]-> (p:Address)返回值。

如何解决这个问题?这是neo4j中的一个错误吗?

3 个答案:

答案 0 :(得分:1)

你实际上没有问过一个问题(你确实刚刚描述了模式匹配的预期行为......即如果没有匹配则没有结果)...但我假设你想要一个解决方案吗?

MATCH (:Some )-[r*0..1]-> (p:Address)
RETURN p
UNION
MATCH (:Some2 )-[r*0..1]-> (p:Address)
RETURN p

应该做的伎俩。请注意,唯一重要的是返回的变量完全相同(它们包含的内容实际上并不重要)。

另外......你可能想看看 OPTIONAL MATCH 做了什么......

希望这有帮助。

此致 汤姆

<强>更新

CALL apoc.cypher.run("
    MATCH (:Some )-[r*0..1]-> (p:Address)
    RETURN p
    UNION
    MATCH (:Some2 )-[r*0..1]-> (p:Address)
    RETURN p",{}) YIELD value
RETURN value.p AS result
ORDER BY result;

答案 1 :(得分:1)

这个简单的查询应该有效:

  3 | var mongoose = require('mongoose');
  4 | var mongoDB = 'mongodb://localhost/my_db_conn';
> 5 | mongoose.connect(mongoDB);
    |          ^
  6 |
  7 | describe('App test', () => {
  8 |     it('has a module', () => {

  at NativeConnection.Object.<anonymous>.Connection.openUri (node_modules/mongoose/lib/connection.js:424:19)
  at Mongoose.Object.<anonymous>.Mongoose.connect (node_modules/mongoose/lib/index.js:208:15)
  at Object.<anonymous> (src/__tests__/app_test.js:5:10)

答案 2 :(得分:0)

感谢您使用以下版本的输入

MATCH (p:Address)
WHERE exist ((:Some )-[r*0..1]-> (p)) OR ((:Some2 )-[r*0..1]-> (p))
RETURN p;