Head's Up! These forums are read-only. All users and content have migrated. Please join us at community.neo4j.com.
11-20-2022 01:11 PM
When I convert part of a query into a subquery that I want to call multiple times, the previously successful results now come up empty. What am I overlooking that causes the query to fail after that conversion?
When this code runs:
// /* find sentences */
match (s1:Sentence) where s1.sentence = $sentenceText
// /* Find sentences' words */
match (s1)-[r1:HAS_WORD]-(w1:Word) where w1.word =~ '.*[a-z].*' and w1.stopword=false
with s1,w1,s1 as s,w1 as w order by w1.count
// /* **************************************************************** */
// /* Down-select to the most important (least common) words */
// /* **************************************************************** */
with s,w
with s,reduce( words = [], n in collect(w) | words + [n]) as words, sum(w.count) as total
with s,words,total,reduce( f =[0,{}], n in words |
case when 1.0* f[0]/total < 0.10 then
case when f[0]=0 then [f[0] + n.count,[n]]
else [f[0] + n.count,f[1]+[n]]
end
else f
end) as frac
with s,words,total,reverse(tail(reverse(frac[1]))) as important
// /* Make list of words assigned probability score of 100% */
unwind important as w
with distinct [w,1.0] as importantScore,s,words,total,important
return distinct s,collect(importantScore) as list,words,total,important
I correctly get
╒══════════════════════════════════════════════════════════════════════╤══════════════════════════════════════════════════════════════════════╤══════════════════════════════════════════════════════════════════════╤═══════╤══════════════════════════════════════════════════════════════════════╕ │"s" │"list" │"words" │"total"│"important" │ ╞══════════════════════════════════════════════════════════════════════╪══════════════════════════════════════════════════════════════════════╪══════════════════════════════════════════════════════════════════════╪═══════╪══════════════════════════════════════════════════════════════════════╡ │{"sentence":"This is a test of the end of the line ... / or not!","lev│[[{"count":1,"stopword":false,"word":"this"},1.0],[{"count":2,"stopwor│[{"count":1,"stopword":false,"word":"this"},{"count":2,"stopword":fals│538 │[{"count":1,"stopword":false,"word":"this"},{"count":2,"stopword":fals│ │el":"L0","count":10,"topic":"NONE","source":"console","idInSrc":""} │d":false,"word":"of"},1.0],[{"count":2,"stopword":false,"word":"or"},1│e,"word":"of"},{"count":2,"stopword":false,"word":"or"},{"count":2,"st│ │e,"word":"of"},{"count":2,"stopword":false,"word":"or"},{"count":2,"st│ │ │.0],[{"count":2,"stopword":false,"word":"the"},1.0],[{"count":2,"stopw│opword":false,"word":"the"},{"count":2,"stopword":false,"word":"not"},│ │opword":false,"word":"the"},{"count":2,"stopword":false,"word":"not"},│ │ │ord":false,"word":"not"},1.0],[{"count":2,"stopword":false,"word":"is"│{"count":2,"stopword":false,"word":"is"},{"count":2,"stopword":false,"│ │{"count":2,"stopword":false,"word":"is"},{"count":2,"stopword":false,"│ │ │},1.0],[{"count":2,"stopword":false,"word":"a"},1.0],[{"count":36,"sto│word":"a"},{"count":36,"stopword":false,"word":"line"},{"count":56,"st│ │word":"a"},{"count":36,"stopword":false,"word":"line"}] │ │ │pword":false,"word":"line"},1.0]] │opword":false,"word":"end"},{"count":433,"stopword":false,"word":"test│ │ │ │ │ │"}] │ │ │ └──────────────────────────────────────────────────────────────────────┴──────────────────────────────────────────────────────────────────────┴──────────────────────────────────────────────────────────────────────┴───────┴──────────────────────────────────────────────────────────────────────┘
But when implemented as a subquery that I want to reuse:
// /* find sentences */
match (s1:Sentence) where s1.sentence = $sentenceText
// /* Find sentences' words */
match (s1)-[r1:HAS_WORD]-(w1:Word) where w1.word =~ '.*[a-z].*' and w1.stopword=false
with s1,w1,s1 as s,w1 as w order by w1.count
// /* **************************************************************** */
// /* Down-select to the most important (least common) words */
// /* **************************************************************** */
CALL {
with s,w
with s,reduce( words = [], n in collect(w) | words + [n]) as words, sum(w.count) as total
with s,words,total,reduce( f =[0,{}], n in words |
case when 1.0* f[0]/total < 0.10 then
case when f[0]=0 then [f[0] + n.count,[n]]
else [f[0] + n.count,f[1]+[n]]
end
else f
end) as frac
with s,words,total,reverse(tail(reverse(frac[1]))) as important
// /* Make list of words assigned probability score of 100% */
unwind important as w
with distinct [w,1.0] as importantScore,s,words,total,important
return distinct collect(importantScore) as list,words,total,important
}
// /* **************************************************************** */
with s1,important as words1,list as list1,total as total1
return s1,words1,list1,total1
I get:
(no changes, no records)
11-20-2022 02:33 PM
You need to add a return statement. The subquery return just returns its columns to the outer query as additional columns. You need to specify and outer query return
11-20-2022 06:48 PM
The outer query does have a return:
// /* **************************************************************** */
with s1,important as words1,list as list1,total as total1
return s1,words1,list1,total1
11-21-2022 09:56 AM
My mistake. I thought the red text was commented out. I agree it should work. You do a lot of renaming variables without any need to do so. You can try the following, as it should represent the same code as without the call subquery.
// /* find sentences */
match (s1:Sentence) where s1.sentence = $sentenceText
// /* Find sentences' words */
match (s1)-[r1:HAS_WORD]-(w1:Word) where w1.word =~ '.*[a-z].*' and w1.stopword=false
with s1,w1,s1 as s,w1 as w order by w1.count
// /* **************************************************************** */
// /* Down-select to the most important (least common) words */
// /* **************************************************************** */
CALL {
with s,w
with s,reduce( words = [], n in collect(w) | words + [n]) as words, sum(w.count) as total
with s,words,total,reduce( f =[0,{}], n in words |
case when 1.0* f[0]/total < 0.10 then
case when f[0]=0 then [f[0] + n.count,[n]]
else [f[0] + n.count,f[1]+[n]]
end
else f
end) as frac
with s,words,total,reverse(tail(reverse(frac[1]))) as important
// /* Make list of words assigned probability score of 100% */
unwind important as w
with distinct [w,1.0] as importantScore,s,words,total,important
return collect(importantScore) as list,words,total,important
}
return distinct s,list,words,total,important
You can also just try 'return *' to see what you get.
11-20-2022 08:03 PM
Variable 'S' is missing in the return statement under CALL.
Try this:
CALL {
with s,w
with s,reduce( words = [], n in collect(w) | words + [n]) as words, sum(w.count) as total
with s,words,total,reduce( f =[0,{}], n in words |
case when 1.0* f[0]/total < 0.10 then
case when f[0]=0 then [f[0] + n.count,[n]]
else [f[0] + n.count,f[1]+[n]]
end
else f
end) as frac
with s,words,total,reverse(tail(reverse(frac[1]))) as important
// /* Make list of words assigned probability score of 100% */
unwind important as w
with distinct [w,1.0] as importantScore,s,words,total,important
return distinct s, collect(importantScore) as list,words,total,important
}
return s as s1, important as words1, list as list1, total as total1
All the sessions of the conference are now available online