riot does it nicely. That's what inspired me to request that arq do it.
Thanks,
Bob
On 2/27/21 5:01 PM, Colin Gross wrote:
Bob,
Yes. I mistakenly tested passing stdin as the --query argument. The
--data argument apparently keys the input type from the suffix of the
filename. That makes it a bit more of a pain to deal with.
#!/bin/sh
# Write some sample data.
cat << DATADOC > /tmp/data.n3
@prefix : <http://inf.ed.ac.uk/ont#> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
:stu foaf:knows :bea ;
foaf:name "Stuart" .
:bea foaf:knows :amy ;
foaf:name "Beatrice" .
:amy foaf:name "Amy" .
:dan foaf:knows :mik ;
foaf:name "Dan" .
:mik foaf:knows :dan ;
foaf:name "Mik" .
DATADOC
# Write a query
cat << QUERYDOC > /tmp/query.rq
SELECT ?s ?p ?o
WHERE { ?s ?p ?o . }
QUERYDOC
# Fails to load data.
# cat /tmp/data.n3 | arq --query=/tmp/query.rq --data=/dev/stdin
# ARQ keys off file suffix to pick up format. Use a named pipe to supply a
filename suffix to --data
mkfifo /tmp/datapipe.n3; \
cat /tmp/data.n3 > /tmp/datapipe.n3 & \
arq --query=/tmp/query.rq --data=/tmp/datapipe.n3; \
rm /tmp/datapipe.n3
Might be worth writing a shell function to wrap the call to arq if this
gets done on the fly often.
Colin A. Gross
On Sat, Feb 27, 2021 at 4:00 PM Bob DuCharme <[email protected]> wrote:
That looked promising to me, but with Jena 3.3 under Ubuntu it gave me
"Failed to load data".
Wouldn't there need to be some way to indicate which serialization the
data was using?
Thanks,
Bob
On 2/27/21 2:47 PM, Colin Gross wrote:
Bob,
Have you tried passing /dev/stdin as the argument for --data? E.g:
arq --query=example.rq --data=/dev/stdin
That should wait on stdin until it hits EOF (ctrl+d).
This should let you piping from a file or wherever E.g.
cat people.n3 | arq --query=example.rq --data=/dev/stdin
If you need to pipe from multiple sources, such as if you need to have
multiple --data args, you could make a series of fifo pipes that data
was fed into by other processes.
Regards,
Colin A. Gross
On Sat, Feb 27, 2021 at 9:41 AM Bob DuCharme <[email protected]> wrote:
This is just an idea. I like how jena's riot utility accepts data from
stdin as long as you provide a --syntax parameter to tell it what
serialization the stdin triples are. When I was at TopQuadrant I liked
SPARQLMotion, their proprietary system for pipelining RDF through
various steps to create an automated workflow. I wrote about doing
something similar with Python in "Pipelining SPARQL queries in memory
with the rdflib Python library" at
http://www.bobdc.com/blog/pipelining-sparql-queries-in-m/ .
<http://www.bobdc.com/blog/pipelining-sparql-queries-in-m/>
I was thinking that if arq could accept triples via stdin like riot can,
I could use curl to pull triples from an endpoint, pipe it to arq
running a CONSTRUCT query that does some cleanup transformations, and
then pipe the output of that to arq to run a SELECT query that pulls
what I ultimately want, all on one command from the command line. (I see
that arq already has a --syntax switch that is about the query itself,
so it would need a different switch to specify the serialization of
input data if it's coming from stdin.)
<http://www.bobdc.com/blog/pipelining-sparql-queries-in-m/>
Of course, I could do all this now from a shell script in which some
lines save output to temporary files and later lines read those, but
supporting stdin would add some flexibility. riot's ability to do this
is inspiring!
Thanks,
Bob