Neo4j display subgraph based on multiple paths

2019-08-19 11:38发布

问题:

I want to display a subgraph in Neo4j(COMMUNITY EDITION on localhost) based on multiple paths. The paths are the result of a custom traversalDescription() with a special evaluate(Path path). The intention was to ignore a special sequence of relationships and nodes(details to sequence). As far as i know its not possible in a cypher query.

The result looks like this:

(268911)
(268911)<--[REL1,151]--(276650)
(268911)<--[REL1,151]--(276650)<--[REL2,715]--(276651)
(268911)<--[REL1,151]--(276650)<--[REL2,715]--(276651)<--[REL1,34]--(259461)
(268911)<--[REL1,151]--(276650)<--[REL2,715]--(276651)<--[REL1,34]--(259461)<--[REL2,749]--(259466)
(268911)<--[REL1,151]--(276650)<--[REL2,715]--(276651)<--[REL1,34]--(259461)<--[REL2,749]--(259466)<--[REL1,230]--(281)
(268911)<--[REL1,151]--(276650)<--[REL2,715]--(276651)<--[REL1,34]--(259461)<--[REL2,749]--(259466)<--[REL1,230]--(281)--[REL2,2923]-->(278)
(268911)<--[REL1,151]--(276650)<--[REL2,715]--(276651)<--[REL1,34]--(259461)<--[REL2,749]--(259466)<--[REL1,230]--(281)--[REL2,2923]-->(278)<--[REL2,1034]--(9)
(268911)<--[REL1,151]--(276650)<--[REL2,715]--(276651)<--[REL1,34]--(259461)<--[REL2,749]--(259466)<--[REL1,230]--(281)--[REL2,2923]-->(278)<--[REL2,1034]--(9)--[REL2,2943]-->(6)
(268911)<--[REL1,151]--(276650)<--[REL2,715]--(276651)<--[REL1,34]--(259461)<--[REL2,749]--(259466)<--[REL1,230]--(281)--[REL2,2923]-->(278)<--[REL2,1034]--(9)--[REL2,1040]-->(396685)
(268911)<--[REL1,151]--(276650)<--[REL2,715]--(276651)<--[REL1,34]--(259461)<--[REL2,749]--(259466)<--[REL1,230]--(281)--[REL2,2923]-->(278)<--[REL2,1034]--(9)--[REL2,1040]-->(396685)<--[REL2,3047]--(396687)
(268911)<--[REL1,151]--(276650)<--[REL2,715]--(276651)<--[REL1,34]--(259461)<--[REL2,559]--(259465)
(268911)<--[REL1,151]--(276650)<--[REL2,715]--(276651)<--[REL1,34]--(259461)<--[REL2,559]--(259465)<--[REL1,294]--(257)
(268911)<--[REL1,151]--(276650)<--[REL2,715]--(276651)<--[REL1,34]--(259461)<--[REL2,559]--(259465)<--[REL1,294]--(257)--[REL2,2959]-->(255)
(268911)<--[REL1,151]--(276650)<--[REL2,715]--(276651)<--[REL1,34]--(259461)<--[REL2,559]--(259465)<--[REL1,294]--(257)--[REL2,2959]-->(255)<--[REL2,379]--(142)
(268911)<--[REL1,151]--(276650)<--[REL2,715]--(276651)<--[REL1,34]--(259461)<--[REL2,559]--(259465)<--[REL1,294]--(257)--[REL2,2959]-->(255)<--[REL2,379]--(142)--[REL2,2892]-->(139)
(268911)<--[REL1,151]--(276650)<--[REL2,715]--(276651)<--[REL1,34]--(259461)<--[REL2,559]--(259465)<--[REL1,294]--(257)--[REL2,2959]-->(255)<--[REL2,379]--(142)--[REL2,626]-->(396840)
(268911)<--[REL1,151]--(276650)<--[REL2,715]--(276651)<--[REL1,34]--(259461)<--[REL2,559]--(259465)<--[REL1,294]--(257)--[REL2,2959]-->(255)<--[REL2,379]--(142)--[REL2,626]-->(396840)<--[REL2,2988]--(396843)
(268911)<--[REL1,151]--(276650)<--[REL2,711]--(276653)
(268911)<--[REL1,151]--(276650)<--[REL2,711]--(276653)<--[REL1,74]--(259462)
(268911)<--[REL1,151]--(276650)<--[REL2,711]--(276653)<--[REL1,74]--(259462)<--[REL2,777]--(259469)
(268911)<--[REL1,151]--(276650)<--[REL2,711]--(276653)<--[REL1,74]--(259462)<--[REL2,777]--(259469)<--[REL1,12]--(283)
(268911)<--[REL1,151]--(276650)<--[REL2,711]--(276653)<--[REL1,74]--(259462)<--[REL2,777]--(259469)<--[REL1,12]--(283)--[REL2,2922]-->(279)
(268911)<--[REL1,151]--(276650)<--[REL2,711]--(276653)<--[REL1,74]--(259462)<--[REL2,777]--(259469)<--[REL1,12]--(283)--[REL2,2922]-->(279)<--[REL2,1032]--(11)
(268911)<--[REL1,151]--(276650)<--[REL2,711]--(276653)<--[REL1,74]--(259462)<--[REL2,777]--(259469)<--[REL1,12]--(283)--[REL2,2922]-->(279)<--[REL2,1032]--(11)--[REL2,2942]-->(8)
(268911)<--[REL1,151]--(276650)<--[REL2,711]--(276653)<--[REL1,74]--(259462)<--[REL2,777]--(259469)<--[REL1,12]--(283)--[REL2,2922]-->(279)<--[REL2,1032]--(11)--[REL2,1039]-->(396683)
(268911)<--[REL1,151]--(276650)<--[REL2,711]--(276653)<--[REL1,74]--(259462)<--[REL2,777]--(259469)<--[REL1,12]--(283)--[REL2,2922]-->(279)<--[REL2,1032]--(11)--[REL2,1039]-->(396683)<--[REL2,3009]--(396684)
(268911)<--[REL1,151]--(276650)<--[REL2,711]--(276653)<--[REL1,74]--(259462)<--[REL2,558]--(259464)
(268911)<--[REL1,151]--(276650)<--[REL2,711]--(276653)<--[REL1,74]--(259462)<--[REL2,558]--(259464)<--[REL1,147]--(259)
(268911)<--[REL1,151]--(276650)<--[REL2,711]--(276653)<--[REL1,74]--(259462)<--[REL2,558]--(259464)<--[REL1,147]--(259)--[REL2,2958]-->(258)
(268911)<--[REL1,151]--(276650)<--[REL2,711]--(276653)<--[REL1,74]--(259462)<--[REL2,558]--(259464)<--[REL1,147]--(259)--[REL2,2958]-->(258)<--[REL2,378]--(143)
(268911)<--[REL1,151]--(276650)<--[REL2,711]--(276653)<--[REL1,74]--(259462)<--[REL2,558]--(259464)<--[REL1,147]--(259)--[REL2,2958]-->(258)<--[REL2,378]--(143)--[REL2,2891]-->(140)
(268911)<--[REL1,151]--(276650)<--[REL2,711]--(276653)<--[REL1,74]--(259462)<--[REL2,558]--(259464)<--[REL1,147]--(259)--[REL2,2958]-->(258)<--[REL2,378]--(143)--[REL2,625]-->(396864)
(268911)<--[REL1,151]--(276650)<--[REL2,711]--(276653)<--[REL1,74]--(259462)<--[REL2,558]--(259464)<--[REL1,147]--(259)--[REL2,2958]-->(258)<--[REL2,378]--(143)--[REL2,625]-->(396864)<--[REL2,3088]--(396867)

Its basically a subgraph starting from one node showing all possible paths(ignoring the sequence). But how to display this in neo4j? Is it possible to use my traverser in neo4j as standard traverser? I want to avoid to pick every single node and query all nodes(possibly tons of nodes).

This solves the problem(for small amount of nodes, copy paste query into webui):

        String query1=null,query2=null;
        int ascii =65;
        try ( Transaction tx = graphDb.beginTx() )
        {
            Traverser traverser = td.traverse(graphDb.getNodeById(id));
            for ( Path path : traverser)
            {
                System.out.println(path.toString());
                if(ascii == 65)
                {
                    query1= "MATCH ("+Character.toString((char) ascii)+")";
                    query2= " WHERE id("+Character.toString((char) ascii)+")="+path.endNode().getId();
                }
                else
                {
                    query1+= ",("+Character.toString((char) ascii)+")";
                    query2+= " AND id("+Character.toString((char) ascii)+")="+path.endNode().getId();
                }
                if(ascii==90)
                    ascii=96;
                ascii++;
            }
            tx.success();
        }
        System.out.println(query1+query2+" RETURN *");

but is there any other solution?