diff --git a/nomad/graph/graph_reader.py b/nomad/graph/graph_reader.py
index e738c4633e6ed7dd5f0bbb322e8af681e2f45977..4593f60f8ff73b8a2fa6fee199c9b84da304d3c8 100644
--- a/nomad/graph/graph_reader.py
+++ b/nomad/graph/graph_reader.py
@@ -310,7 +310,9 @@ def _if_exists(target_root: dict, path_stack: list) -> bool:
 @functools.lru_cache(maxsize=1024)
 def _convert_ref_to_path(ref: str, upload_id: str = None) -> list:
     # test module name
-    if '.' in (stripped_ref := ref.strip('.')):
+    if '.' in (stripped_ref := ref.strip('.')) or re.compile(r'^\w*(\.\w*)*$').match(
+        ref.split('/section_definitions')[0]
+    ):
         module_path, _ = split_python_definition(stripped_ref)
         return [Token.METAINFO, '.'.join(module_path[:-1])] + module_path[-1].split('/')
 
@@ -2413,10 +2415,18 @@ class ArchiveReader(GeneralReader):
         if isinstance(original_def, SubSection):
             return node.replace(definition=original_def.sub_section.m_resolved())
 
+        # todo: those three should be handled differently as they are not references
+        from nomad.datamodel.data import UserReference, AuthorReference
+
+        from nomad.datamodel.datamodel import DatasetReference
+
         # if not a quantity reference, early return
         if not (
             isinstance(original_def, Quantity)
             and isinstance(original_def.type, Reference)
+            and not isinstance(
+                original_def.type, (UserReference, AuthorReference, DatasetReference)
+            )
         ):
             return node
 
diff --git a/nomad/graph/model.py b/nomad/graph/model.py
index b6ac2b7f771562a647564fe2e35fc34817c6d1bf..6a1f9fc4192db9321a59b8e83aa9274617a4d614 100644
--- a/nomad/graph/model.py
+++ b/nomad/graph/model.py
@@ -319,9 +319,7 @@ def _normalise_pattern(pattern: FrozenSet[str]) -> FrozenSet[str]:  # pylint: di
     pattern = frozenset(re.sub(r'\*+', '*', v) for v in pattern)
     pattern = frozenset(re.sub(r'\.', r'\.', v) for v in pattern)
     # replace wildcard with regex
-    pattern = frozenset(
-        v.replace('*', r'[\w\./]*').replace('?', r'[\w\./]') for v in pattern
-    )
+    pattern = frozenset(v.replace('*', r'.*').replace('?', r'.?') for v in pattern)
     # add ^ and $ to the pattern if not present
     pattern = frozenset('^' + v if not v.startswith('^') else v for v in pattern)
     pattern = frozenset(v + '$' if not v.endswith('$') else v for v in pattern)