1. Reworked subclass handling. No longer return subclass node ids with a query_id in node bindings. Instead, when a subclass edge and node are used to infer a result, always return the queried node ids as node bindings, and create new edges that are composites of edges that match query edges and the subclass edges that were used to infer that result. Use support graphs (auxiliary graphs) to show when these edges were used to generate a result. Queries without edges do not perform node subclass inference anymore.
2. Updated dependencies, actions, and tests to support neo4j 5 and python 3.12 (as well as python 3.9).
3. Removed HTTP protocol functionality and NEO4J_PROTOCOL env var usage.
4. Added a fallback for attribute mapping lookups. If an attribute is not included in explicitly defined attribute type mappings, use the biolink model to see if it's valid biolink.