Discussion about this post

User's avatar
Neural Foundry's avatar

The graph-based approach to architectural enforcement is way more powerful than traditional static analysis. What I really like is how you've made architecture violations objectively detectable rather than subjectively debatable. The Cypher queries for layering constraints are clean too, though I wonder how this scales when you hit polyglot codebases where some boundries cross JVM languages. Definetly trying this on a legacy system where "layers" are more aspirational than actual.

MichalCh's avatar

Hi Markus,

thanks a lot for the great write‑up—this was super helpful to get started with jQAssistant in a Quarkus app! 🙌

While applying the tutorial, I ran into two small issues (tested with your Quarkus/jQAssistant version):

1. Annotation check path

The annotation match needs the intermediate node between ANNOTATED_BY and the annotation Type. Using OF_TYPE fixed it for me:

MATCH (s)-[:ANNOTATED_BY]->()-[:OF_TYPE]->(ann:Type)

Without [:OF_TYPE], the pattern won’t reach the annotation’s Type node.

2. Dependency constraint

In the “... must not depend on …” rule, I needed one extra guard to avoid a false positive on the synthetic void type:

AND d.fqn <> 'void'

If this was on purpose (e.g., simplified for the tutorial), please disregard; otherwise, hopefully this helps someone using the code base - it definitely helped me.

Thanks again for sharing your knowledge and for all your work in the Quarkus community! 🚀

1 more comment...

No posts

Ready for more?