I have many different nodes connected with relationships. On those relationships, I use some properties of type Enum, and I am trying to query through the relationships using the Cyper language and only return those who have the Enum property being in an array. Also, the relationship I am trying to query against is a subclass of another one which has the property I want to query with. Here's an example:
@RelationshipEntity
public class Mother {
@Indexed(level=Level.INSTANCE) Visibility visibility;
public Visibility getVisibility() {
return visibility;
}
public void setVisibility(Visibility visibility) {
this.visibility = visibility;
}
}
public class Child extends Mother {
@StartNode StartNode start;
@EndNode EndNode end;
}
Imagine that the visibility is an enum that can be either Private, Network or Public. Then in a repository I tried the following queries, but it always returns everything or throws an error:
@Query("start s=node({0}) match s-[r:TYPE]->e where r.visibility='Private' return r")
Iterable<Child> findChildren(StartNode start);
@Query("start s=node({0}) match s-[r:TYPE]->e where r.visibility=\"Private\" return r")
Iterable<Child> findChildren(StartNode start);
@Query("start s=node({0}) match s-[r:TYPE]->e where r.visibility=Private return r")
Iterable<Child> findChildren(StartNode start);
What I would really like to use is the 'IN' operator, but that throws an error like if it didn't know what IN was.
@Query("start s=node({0}) match s-[r:TYPE]->e where r.visibility in ['Private', 'Network'] return r")
Iterable<Child> findChildren(StartNode start);
Is my Visibility not being indexed? or am I not supposed to do this? I haven't tried changing the Visibility property by a string instead, which I suppose should work since I have other String properties that I can query against successfully. Using the 'IN' operator is a bonus!
Edit 1:
I am using spring-data-neo4j 2.0.1.RELEASE. I am trying to do this in Unit testing, using org.neo4j.test.ImpermanentGraphDatabase
, but I just realised that the query @Query("start s=node({0}) match s-[r:TYPE]->e where r.visibility='Private' return r")
works when running the server, using the default configuration, but it still doesn't work in unit testing. Also, even when running the server, the 'IN' clause still throws an error. Is this related to the version I am using? I remember trying to use a more recent version but then dependencies failed, maybe I should try again.
Edit 2: So I updated the version of spring-data-neo4j to 2.1.0.BUILD-SNAPSHOT, upgraded neo4j version to 1.7 also. Now I don't have an error for the 'IN' keyword, but I don't know what syntax should I use to pass along the values to search against. So having
@Query("start s=node({0}) match s-[r:TYPE]->e where r.visibility in [{1}] return r")
Iterable<Child> findChildren(StartNode start, String visibility);
works if I pass along a simple String like Public
, but not if I pass along Public, Private
which never returns anything, even though Public
does return matches. I also tried changing the parameter String visibility
for a String[] visibility
, but that doesn't work at all.
r.visibility in {1}
without the square brackets. – Michael Hunger