Nice use of Jsonata once again @E1cid.
I've been struggling all morning to get chatgpt to give me a working Jsonata expression!
Edit: The flow I first posted failed to notice junctions linked to from the second output of a node.
I think this is better, no Jsonata any more 
[{"id":"ab16fa6f24cb59e6","type":"tab","label":"Disconnected junctions","disabled":false,"info":"","env":[]},{"id":"f678564d8f5fe523","type":"group","z":"ab16fa6f24cb59e6","name":"Test Nodes","style":{"label":true},"nodes":["71fbd21251a2b603","025d2ddbe90f41f1","bfe0dc550fd5f618","804e1f7280eec964","452812f6f4ce7081","820a5e11855cc166","ed4316537e081e33"],"x":614,"y":74,"w":352,"h":132},{"id":"025d2ddbe90f41f1","type":"junction","z":"ab16fa6f24cb59e6","g":"f678564d8f5fe523","x":640,"y":120,"wires":[[]]},{"id":"bfe0dc550fd5f618","type":"junction","z":"ab16fa6f24cb59e6","g":"f678564d8f5fe523","x":640,"y":140,"wires":[["71fbd21251a2b603","ed4316537e081e33"]]},{"id":"804e1f7280eec964","type":"junction","z":"ab16fa6f24cb59e6","g":"f678564d8f5fe523","x":940,"y":100,"wires":[[]]},{"id":"452812f6f4ce7081","type":"junction","z":"ab16fa6f24cb59e6","g":"f678564d8f5fe523","x":940,"y":140,"wires":[[]]},{"id":"820a5e11855cc166","type":"junction","z":"ab16fa6f24cb59e6","g":"f678564d8f5fe523","x":940,"y":180,"wires":[[]]},{"id":"ed4316537e081e33","type":"junction","z":"ab16fa6f24cb59e6","g":"f678564d8f5fe523","x":760,"y":100,"wires":[["804e1f7280eec964"]]},{"id":"231f8b2a169ba37b","type":"junction","z":"ab16fa6f24cb59e6","x":840,"y":100,"wires":[[]]},{"id":"bcd4bc8e5fa549df","type":"file in","z":"ab16fa6f24cb59e6","name":"Scan flows file","filename":"path","filenameType":"msg","format":"utf8","chunk":false,"sendError":false,"encoding":"none","allProps":false,"x":280,"y":80,"wires":[["5989a3158b6f6489"]]},{"id":"5989a3158b6f6489","type":"json","z":"ab16fa6f24cb59e6","name":"","property":"payload","action":"","pretty":false,"x":510,"y":80,"wires":[["d01ad68650990728"]]},{"id":"d01ad68650990728","type":"function","z":"ab16fa6f24cb59e6","name":"Find tab names & junctions","func":"let tablist = {}\nlet junctionlist = {}\nfor (let i in msg.payload) {\n const id = msg.payload[i].id\n if (msg.payload[i].type == \"tab\") {\n tablist[id] = msg.payload[i].label\n }\n if (msg.payload[i].type == \"junction\") {\n junctionlist[id] = msg.payload[i]\n junctionlist[id].incomingwires = false\n junctionlist[id].outgoingwires = false\n }\n}\nflow.set(\"tablist\", tablist)\nflow.set(\"junctionlist\", junctionlist)\nreturn msg","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":320,"y":140,"wires":[["331897a2ac770c97"]]},{"id":"012b5103d31885d9","type":"json","z":"ab16fa6f24cb59e6","name":"","property":"payload","action":"","pretty":false,"x":510,"y":200,"wires":[["6dbb7671391fd1de"]]},{"id":"331897a2ac770c97","type":"file in","z":"ab16fa6f24cb59e6","name":"Rescan flows file","filename":"path","filenameType":"msg","format":"utf8","chunk":false,"sendError":false,"encoding":"none","allProps":false,"x":290,"y":200,"wires":[["012b5103d31885d9"]]},{"id":"6dbb7671391fd1de","type":"function","z":"ab16fa6f24cb59e6","name":"find junctions' incoming wires","func":"let junctionlist = flow.get('junctionlist') || {}\nconst tablist = flow.get('tablist') || {}\n\nfor (let i in msg.payload) { // EACH NODE IN FLOW FILE\n const id = msg.payload[i].id\n if (msg.payload[i].type == \"junction\") { // If it's a junction, update tab name\n const tabid = msg.payload[i].z\n junctionlist[id].tab = tablist[tabid]\n }\n\n if (msg.payload[i].wires && msg.payload[i].wires.length > 0) { // If it has outgoing wires\n let wires = msg.payload[i].wires \n for (let j=0; j< wires.length; j++) { // Each node output\n let linkids = wires[j]\n for (let k=0; k<linkids.length; k++) { // Each linked ID\n const linkid = linkids[k]\n if (junctionlist[linkid]) { // This node is wired to a junction, update junction incomingwires\n junctionlist[linkid].incomingwires = true;\n }\n if (msg.payload[i].type == \"junction\") { // This node is a junction AND has outgoing wire[s]\n junctionlist[id].outgoingwires = true;\n }\n }\n }\n }\n}\n\nflow.set('junctionlist', junctionlist);\nlet newmsg = {}\nnewmsg.payload = {\"junctionCount\": 0, \"neither\":[], \"noIncoming\":[], \"noOutgoing\":[]}\nfor (let i in junctionlist) {\n const usefuldata ={\n \"id\":junctionlist[i].id,\n \"tab\":junctionlist[i].tab,\n \"x\": junctionlist[i].x,\n \"y\": junctionlist[i].y\n }\n if (junctionlist[i].incomingwires === false && junctionlist[i].outgoingwires === false) {\n newmsg.payload.neither.push(usefuldata)\n }\n else if (junctionlist[i].incomingwires === false) {\n newmsg.payload.noIncoming.push(usefuldata)\n }\n else if (junctionlist[i].outgoingwires === false) {\n newmsg.payload.noOutgoing.push(usefuldata)\n }\n newmsg.payload.junctionCount ++\n}\nreturn newmsg;\n\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":320,"y":260,"wires":[["b4bc4f8df7dfa00b"]]},{"id":"b4bc4f8df7dfa00b","type":"debug","z":"ab16fa6f24cb59e6","name":"debug 10","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":680,"y":260,"wires":[]},{"id":"f492b248145e9d02","type":"inject","z":"ab16fa6f24cb59e6","name":"flows file","props":[{"p":"path","v":"/home/pi/.node-red/flows.json","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":120,"y":80,"wires":[["bcd4bc8e5fa549df"]]},{"id":"71fbd21251a2b603","type":"change","z":"ab16fa6f24cb59e6","g":"f678564d8f5fe523","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"","tot":"str"},{"t":"set","p":"payload","pt":"msg","to":"","tot":"str"},{"t":"set","p":"payload","pt":"msg","to":"","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":820,"y":140,"wires":[["804e1f7280eec964","452812f6f4ce7081","820a5e11855cc166"]]}]
15 junctions, but only 6 of them not connected (all in Test nodes on this flow)