Tony Ennis
Tony Ennis

Reputation: 12289

Cypher query doesn't return all the expected nodes

I have this graph:

A<-B->C

B is the root of a tiny tree. There is exactly one relation between A and B, and one between B and C.

When I run the following, one node is returned. Why does this Cypher query not return the A and C nodes?

MATCH(a {name:"A"})<-[]-(rewt)-[]->(c) RETURN c

It would seem to be that the first half of that query would find the root, and the second half would find both child nodes.

Until a few minutes ago, I would have thought it logically identical to the following query which works. What's the difference?

MATCH (a {name:"A"})<-[]-(rewt)
MATCH (rewt)-[]->(c)
RETURN c

EDIT for cybersam

I have abstracted my database so we could discuss my specific issue. Now, we still have a tiny tree, but there are 4 nodes that are children of the root.(Sorry this is different, but I'm developing and don't want to change my environment too much.)

This query returns all 4:

match(a)<-[]-(b:ROOT)-[]->(c) return c

One of them has a name of "dddd"...

match(a {name"dddd"})<-[]-(b:ROOT)-[]->(c) return c

This query only returns three of them. "dddd" is not included. omg.

To answer cybersam's specific question, this query:

MATCH (a {name:"dddd"})<--(rewt:CODE_ROOT)
MATCH (rewt)-->(c)
RETURN a = c;

Returns four rows. The values are true, false, false, false

Upvotes: 0

Views: 500

Answers (3)

Mats Rydberg
Mats Rydberg

Reputation: 340

In each MATCH clause, each relationship will be matched only once. See http://neo4j.com/docs/stable/cypherdoc-uniqueness.html for reference.

See this related question as well: What does a comma in a Cypher query do?

Upvotes: 0

cybersam
cybersam

Reputation: 66957

[UPDATED]

There is a difference between your 2 queries. A MATCH clause will filter out all duplicate relationships.

Therefore, your first query would filter out all matches where the left-side relationship is the same as the right-side relationship:

MATCH(a {name:"A"})<--(rewt)-->(c)
RETURN c;

Your second query would allow the 2 relationships to be the same, since the relationships are found by 2 separate MATCH clauses:

MATCH (a {name:"A"})<--(rewt)
MATCH (rewt)-->(c)
RETURN c;

If I am right, then the following query should return N rows (where N is the number of outgoing relationships from rewt) and only one value should be true:

MATCH (a {name:"A"})<--(rewt)
MATCH (rewt)-->(c)
RETURN a = c;

Upvotes: 2

Augusto Chaves
Augusto Chaves

Reputation: 13

Both work just fine for me. I've tried on 2.3.0 Community. Do you mind posting your CREATE command ?

Upvotes: 0

Related Questions