0
votes

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.

3
Please use r.visibility in {1} without the square brackets.Michael Hunger

3 Answers

0
votes

@Guillaume,

This is done: https://jira.springsource.org/browse/DATAGRAPH-281

It is available in build snapshots, and will be in SDN 2.1.RC4/GA

Regards,

Lasse

0
votes

Have you tried to execute the queries just standalone against the db? Either with the neo4j-shell, neoclipse or the server? Or programmatically in a unit-test? And also check the db, if your nodes and relationships are there and which properties they have.

Indexing is not related to your query.

Enums are stored as strings in properties.

Some notes:

  • how do you create the relationships?
  • private classes for entities can probably cause problems
  • make sure that the TYPE relationship-type is really what you use

This example in the neo4j console shows that it works. What version of Neo4j are you using?

0
votes

Gillaume:

You have found a weak spot; I have raised an issue, and this will be worked on soon. You can track it here:

https://jira.springsource.org/browse/DATAGRAPH-281

Regards,

Lasse