```ts
export function orderRelation(pairs: [string, string][], x: string, y: string): string {
  if (x === y) throw new Error("Query items cannot be the same.");
  
  const graph = new Map<string, Set<string>>();
  
  for (const [a, b] of pairs) {
    if (!graph.has(a)) graph.set(a, new Set());
    if (!graph.has(b)) graph.set(b, new Set());
    
    graph.get(a)?.add(b);
    graph.get(b)?.add(a);
  }
  
  const dfs = (node: string, visited: Set<string>): boolean => {
    if (visited.has(node)) return false;
    visited.add(node);
    
    for (const neighbor of graph.get(node) || []) {
      if (!dfs(neighbor, visited)) return false;
    }
    
    return true;
  };
  
  const isReachable = (node: string): boolean => dfs(node, new Set());
  
  if (isReachable(x) && isReachable(y)) return "both";
  else if (isReachable(x)) return "before";
  else if (isReachable(y)) return "after";
  else return "unordered";
}
```