In response to the updated restrictions, one solution is to output A and X, and then lay out a graph around them:
graph sample { overlap=false; splines=true; tailclip=false; headclip=false; A [pin=true,pos="0,.2"] X [pin=true,pos="0,.1"] A -- I A -- J A -- B A -- H A -- E A -- K B -- D B -- C B -- L C -- M C -- N C -- O D -- P D -- Q E -- R F -- A G -- F H -- J A -- X

I tried linking with both neato and fdp and it seems to create the graph as you want. Naturally, if you want to impose such a restriction on arbitrary pairs of nodes on the same graph, this solution may not work.
--- Earlier answer ---
If you are committed to using neato, I'm not sure there is a way to solve the problem without changing the schedule at the post-processing stage. If neato is just convenient by default, then you should solve your problem by using a dot instead of your layout and using "rankdir = UD", as well as a couple extra kludges if X should be south.
If you only need a restriction to apply for one node X, then placing X and A together in the cluster should complete the task:
graph sample { rankdir=UD layout=dot overlap=false
If you need a strict south constraint to apply to arbitrary children of A, then this clustering is accompanied by the trick described in:
How to force all nodes in one column in graphviz?
can do the trick. The clusterrank=local attribute may also be useful in this case, but I'm not sure. Hope this helps.
Chris source share