- From: Daniel Hernandez <daniel@degu.cl>
- Date: Mon, 06 Dec 2021 15:10:58 +0100
- To: W3C Ruby RDF mailing list <public-rdf-ruby@w3.org>
Hi,
I am surprised because URIs are translated to S-expressions in different
ways. That means that I can get:
uri1 == uri2 #=> true
uri1.to_sxp #=> wdt:P31
uri2.to_sxp #=> <http://www.wikidata.org/prop/direct/P31>
In this case uri1 is translated using a prefix. To create a URI that is
translated using a prefix, this URI have to be inside a query using that
prefix. For instance, the following query:
query = <<~QUERY
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX wd: <http://www.wikidata.org/entity/>
SELECT *
WHERE { ?person wdt:P31 wd:Q5 }
QUERY
exp = SPARQL.parse(query).to_sxp_bin
=> [:prefix,
[[:"wdt:", #<RDF::URI:0xfe4 URI:http://www.wikidata.org/prop/direct/>],
[:"wd:", #<RDF::URI:0xff0 URI:http://www.wikidata.org/entity/>]],
[:bgp,
[:triple,
#<RDF::Query::Variable:0xfb8(?person)>,
#<RDF::URI:0x1004 URI:http://www.wikidata.org/prop/direct/P31>,
#<RDF::URI:0xfbc URI:http://www.wikidata.org/entity/Q5>]]]
Then I can print the query as a S-expression:
puts exp.to_sxp
=> "(prefix ((wdt: <http://www.wikidata.org/prop/direct/>)
(wd: <http://www.wikidata.org/entity/>))
(bgp (triple ?person wdt:P31 wd:Q5)))"
An I can print a part of the query:
puts exp[2].to_sxp
=> "(bgp (triple ?person wdt:P31 wd:Q5))"
However, the second sxp is wrong, because does not define the prefixes.
I also noticed that to equivalent URIs can be printed differently:
uri1 = exp[2][1][2]
uri2 = RDF::URI.new uri1.to_s
uri1 == uri2 #=> true
uri1.to_sxp #=> wdt:P31
uri2.to_sxp #=> <http://www.wikidata.org/prop/direct/P31>
I see two ways to fix the second pattern:
1. Generate the sxp without prefixes.
(i.e., print <http://www.wikidata.org/prop/direct/P31>)
2. Add the prefixes to the second expression
(i.e., add the prefix wd: <http://www.wikidata.org/prop/direct/>
to the expression.
Hence, I have two questions:
1) Can I get the respresentation without prefixes of an expression.
For instance, with a parameter like this:
exp[2].to_sxp(with_prefixes: false)
=> (bgp (triple ?person
<http://www.wikidata.org/prop/direct/P31>
<http://www.wikidata.org/entity/Q5>))
2) Can I get the prefixed that each URI as follows:
uri1.get_prefix #=> [:"wdt:", #<RDF::URI:0xfe4 URI:http://www.wikidata.org/prop/direct/>]
Thanks,
Daniel
Received on Monday, 6 December 2021 14:11:19 UTC