Search code examples
databasedatalog

Souffle query returning zero results


I am writing a Souffle query that operates on family relationships:

.decl Parent(x: symbol, y: symbol)
.input Parent

.decl Descendant(x: symbol, y: symbol)
.output Descendant
.printsize Descendant

Descendant(x, y) :- Parent(x, y).
Descendant(x, y) :- Parent(z, y), Descendant(x, z).

.decl Qslow(x: symbol)
.output Qslow
.printsize Qslow

Qslow(x) :- Descendant("Alice", x).

I have some facts in a TSV file Parent.facts:

"Alice" "john"
"john"  "mary"
"mary"  "elizabeth"
"Bob"   "charles"

And running souffle seems to generate the right output for the Descendant relation (three descendants for "Alice"):

hickory% souffle -F. -D. descendants.dl
Descendant      7
Qslow   0
hickory% 

However, Qslow produces zero results. I would instead expect three results. This makes me suspicious of the definition of Qslow, but I am not sure what the issue is. Am I doing something weird with symbol syntax? It looks like I am using the same syntax as in the docs.

If I try adding another clause to the conjunction, I still get zero results:

Qslow(x) :- Descendant(y, x), y="Alice".

Solution

  • You have specified the file Parent.facts in the wrong data format. It should be

    john    mary
    mary    elizabeth
    Bob charles
    

    without double quotes and tabs to separate elements of tuples. Only facts in the program use double-quotes.