Search code examples
javaneo4jneo4j-ogm

Neo4j OGM 2.0 query path


I am trying to perform a query which returns a path, however, although the same query executed in neo4j Web UI returns a correct result, the neo4j-ogm returns null. I have installed neo4j-ogm-api,core:2.0.0-M01 from Maven.

My java code looks as follows:

Root.java:

@NodeEntity
public class Root
{
    @GraphId
    public Long id;

    @Relationship(type = "Branch", direction = Relationship.OOUTGOING)
    public List<Branch> branches = new ArrayList<>();

    public Branch addLeaf(Leaf leaf, float length)
    {
        Branch b = new Branch(this, leaf);
        b.length = length;
        leaf.branch = b;
        branches.add(b); 
        return b;           
    }
}

Leaf.java:

@NodeEntity
public class Leaf
{
    @GraphId
    public Long id;

    @Property
    public String color;

    @Relationship(type = "Branch", direction = Relationship.INCOMING)
    public Branch branch;
}

Branch.java:

@RelationshipEntity
public class Branch
{        
    @GraphId
    public Long id;

    public Branch(Root root, Leaf leaf)
    {
        this.root = root;
        this.leaf = leaf;
    }

    @Property
    public float length;

    @StartNode
    public Root root;

    @EndNode
    public Leaf leaf;
}

Then, for testing let's do

public class Main {

    public static void main(String[] args) {

        SessionFactory sessionFactory = new SessionFactory("com.my.package.name");
        Session session = sessionFactory.openSession();

        Root r = new Root()
        r.addLeaf(new Leaf(), 1);
        r.addLeaf(new Leaf(), 2);
        session.save(r);

        //Until this point everything is alright and
        // all 3 nodes and 2 relationships are created

        String query = "MATCH path = (l1:Leaf)-[*1..100]-(l2:Leaf) WITH path LIMIT 1 RETURN path";
        QueryResultModel qrm = session.query(query, new HashMap<String, Object>());
        // qrm.result.get(0).get("path")  is null
    }
}

Please, explain to me what am I doing wrong?


Solution

  • Returning a full path is not supported. Instead, you need to return the nodes and relationships that you want mapped back to domain entities, such as:

    MATCH path = (l1:Leaf)-[*1..100]-(l2:Leaf) WITH path,l1 LIMIT 1 RETURN l1,nodes(path),rels(path)

    This will give you an org.neo4j.ogm.session.Result object. If you retrieve l1 from the underlying Map, you should have a fully hydrated Leaf entity.

    BTW not sure what QueryResultModel is- a QueryResult is only supported in SDN.