Thanks Michael! I looked for a function like that, but I sure missed it!
Thanks again! On August 20, 2016 4:33:11 AM MDT, Michael Hunger <michael.hun...@neotechnology.com> wrote: >Hey, > > >sorry for the delay. You could use the allShortestPaths option too. > >And shortest paths actually take predicates into account that follow it >in >the where clause. > >I don't know how you got this query to run, because UNWIND is not a >function but a clause: > >match path = shortestPath( (n)-[*]->(m) ) >return collect(distinct unwind(nodes(path))), collect(distinct >unwind(rels(path))) > > >For your other query, the initial lookup of those nodes will be slow >(it has to scan the full graph) b/c you don't have a label (using an >index) on them. > >You probably also want to add a direction (if it makes sense) > > >Sorry I wrote the original statement just out of the top of my head, >here >is the fixed version > >// bind n, m, limit rel-type(s) >match path = shortestPath( (n)-[*]->(m) ) >// optionally WHERE with predicates for the shortest paths >unwind nodes(path) as node >with collect(distinct node) as nodes, collect(path) as paths >unwind paths as path >unwind rels(path) as r >with collect(distinct r) as relationships, nodes >return count(*) > >// enable use of indexes, even if "Node" is just a generic label (I >still >think that using label-sets instad of nodetype is better > MATCH (start:Node) WHERE start.nodetype = 'Drone' AND >start.designation = {name} > MATCH (m:Node) WHERE m.nodetype IN {nodetypes} > MATCH p = shortestPath( (start)-[:`*%s`**]-(m) ) >// this spans up a cross product between ALL nodes and ALL rels of the >paths which can potentially become huge >// you can check it with returning count(*), count(distinct n), >count(distinct r) after the two unwinds > UNWIND nodes(p) AS n > UNWIND rels(p) AS r > RETURN [x in COLLECT(DISTINCT n) WHERE x.nodetype in {nodetypes}] >AS nodes, > COLLECT(DISTINCT r) AS relationships > >On Mon, Aug 8, 2016 at 12:40 PM, Alan Robertson <al...@unix.sh> wrote: > >> I had written up my problem here too: >> http://assimilationsystems.com/2016/07/03/assimilation- >> subgraph-queries/ >> >> Here's a thought which occurred to me while sleeping last night... >> The two ways I've done it are: >> >> 1. shortest paths from initial node set >> 2. all paths >> >> As noted in the original email thread below, the problems I ran into >are: >> >> 1. Shortest paths produces all nodes, but misses some >relationships I >> care about. >> 2. All paths produces all nodes and relationships but takes a >really >> long time and often times out. >> >> A way which occurred to me while sleeping tonight was to create a >2-step >> query like this: >> >> Compute the set of shortest paths to get the set of nodes (as in (1) >> above). Ignore the relationships produced. >> From that set of nodes (n) compute (n)-[:a|b|c|d]-(n) and return 'n', >> relationships. >> >> If Cypher won't let me compute from 'n' to 'n', then compute the from >> n-[:a|b|c|d]-m WHERE m.nodetype is in the same set of node types as >was in >> the original constraint. Then return n, relationships. [Although it's >> obvious, I'll mention that the difference is that the second query >only >> follows a single level of relationship]. >> >> It still might need a little experimentation... >> >> Any thoughts? >> >> I'm going back to bed now. Will look into it some more in the >morning... >> ;-) >> >> >> >> On 07/21/2016 02:09 PM, Alan Robertson wrote: >> >> On 04/28/2016 03:32 PM, Alan Robertson wrote: >> >> The query isn't quite right. It has an error in it (variable n >already >> used) and something about the order of operations causes it to return >more >> than one row - with duplicates ;-) >> >> But this one seems to do the trick: >> >> match path = shortestPath( (n)-[*]->(m) ) >> return collect(distinct unwind(nodes(path))), collect(distinct >unwind(rels(path))) >> >> That query is quite fast -- but... >> >> I don't actually want *only* the shortest paths, I want all the paths >> that involve those relationships. >> >> But if I delete the shortestPath() function call it runs so long I >get an >> HTTP timeout on many of these queries. I restrict the types of >> relationships with [:rel1type|:rel2type|:etctype*]. And even though >the >> result only includes one or two additional paths, it runs like 100 >times >> slower - and often just times out via REST (via Py2neo). >> >> That's really disappointing. >> >> Does anyone have a suggestion on how to make this faster - or at >least not >> time out? >> >> >> >> -- >> >> Alan Robertson / CTO >> al...@assimilationsystems.com / +1 303.947.7999 >> >> Assimilation Systems Limited >> http://AssimilationSystems.com >> >> [image: Twitter] <https://twitter.com/ossalanr> [image: Linkedin] >> <https://www.linkedin.com/in/alanr> [image: skype] >> <https://htmlsig.com/skype?username=alanr_unix.sh> >> -- Sent from my Android device with K-9 Mail. Please excuse my brevity. -- You received this message because you are subscribed to the Google Groups "Neo4j" group. To unsubscribe from this group and stop receiving emails from it, send an email to neo4j+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.