Skip to content

apoc.merge.relationship onMatchProps and db.index.fulltext.query* options are not accepted at all #8103

Closed

Description

@robfrank

Summary

Follow-up to #7427. That issue, and its sibling #8102, are about trailing parameters ArcadeDB implements but declares mandatory. This one is the other half of the same sweep: trailing parameters ArcadeDB does not accept at all, so a Neo4j/APOC call that passes them is rejected as "too many arguments" rather than being honoured or ignored.

merge.relationship — onMatchProps

APOC: apoc.merge.relationship(startNode :: NODE, relationshipType :: STRING, identProps :: MAP, onCreateProps :: MAP, endNode :: NODE, onMatchProps = {} :: MAP).

ArcadeDB (com.arcadedb.query.opencypher.procedures.merge.MergeRelationship) declares getMinArgs() == getMaxArgs() == 5, so the six-argument APOC form fails with Procedure 'merge.relationship' expects 5 arguments but got 6. There is no way to express "set these properties when the relationship already existed".

db.index.fulltext.queryNodes / queryRelationships — options

Neo4j: db.index.fulltext.queryNodes(indexName :: STRING, queryString :: STRING, options = {} :: MAP), same shape for queryRelationships.

ArcadeDB (DbIndexFulltextQueryNodes, DbIndexFulltextQueryRelationships) declares getMinArgs() == getMaxArgs() == 2, so a call carrying options (skip, limit, analyzer) is rejected with expects 2 arguments but got 3.

Why this is a separate issue from #7427 / #8102

Those two are one-line arity relaxations: the parameter is already supported, only its mandatory declaration is wrong. Here the parameter has no implementation behind it, so raising getMaxArgs() alone would silently swallow an argument the caller expects to take effect — worse than the current error. Each needs the behaviour built and tested:

  • onMatchProps: apply the map to the relationship on the match branch of merge.relationship, mirroring how onCreateProps is applied on the create branch.
  • fulltext options: decide which of Neo4j's keys ArcadeDB can honour and reject the rest explicitly, rather than ignoring unknown keys.

Splitting them into one issue each is reasonable if they are picked up separately.

Fix

Per procedure: implement the trailing parameter, raise getMaxArgs(), and add a regression test driving the full-arity call through a Cypher CALL plus one asserting the new arity bounds.

Found by the completeness sweep on #7427. The argument counts above are read from the getMinArgs()/getMaxArgs() declarations in the named classes on main.

Activity

  1. added this to the 26.10.1 milestone on Sep 21, 2026
  2. self-assigned this
    on Sep 21, 2026
  3. added
    in progressThe team is actively working on this issue
    engineCore engine: document/schema API
    on Sep 21, 2026
  4. added a commit that references this issue on Sep 22, 2026
  5. robfrank commented on Sep 22, 2026

    @robfrank
    CollaboratorAuthor

    Fixed in #8119, merged.

    All three procedures now accept the trailing arguments and act on them - the point you made in the issue, that raising the declared arity alone would have been worse than the error it replaced, is what shaped the fix:

    • merge.relationship takes a sixth argument, onMatchProps, applied to the relationship on the match branch only, mirroring how onCreateProps applies on the create branch. An omitted or empty map writes nothing, so the five-argument form behaves exactly as before.
    • db.index.fulltext.queryNodes / queryRelationships take a third argument, options, honouring skip and limit. analyzer is refused by name with a message saying why - ArcadeDB resolves the analyzer from the metadata written when the index was created and has no query-time override, so accepting the key and ignoring it would have run the search under an analyzer you did not ask for and reported success. Any other key is refused by name too.

    Minimum argument counts are unchanged everywhere, so every call that worked before still works.

    Still open


    ❤️ Thanks for helping make ArcadeDB better! ArcadeDB is free and open source, sustained by its community. If it's useful to you or your company, please consider becoming a sponsor to keep development going.

  6. removed
    in progressThe team is actively working on this issue
    on Sep 22, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

engineCore engine: document/schema APIenhancementNew feature or requestopencypherseverity:minorCosmetic, documentation, edge case, or a workaround exists

Type

No type

Projects

No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions