Hi,
I stand corrected, Oracle does support XML in their relation DB. I've
seen some of these articles before, but mistakenly understood that is
was a separate DB. My experience of Oracle doesn't go much further than
playing with XE. If I understand the example correctly you would query
XML data in a blob (mytable.productlist) as:
XQuery for $i in ora:view("mytable")/ROW where status="abc" return
<item>{$i/productlist/product/description}</item>;
or
SELECT XQuery("for $i in $y return
<item>{$i/product/description}</item>" PASSING productlist RETURNING
CONTENT) FROM mytable.productlist WHERE status="abc";
So basically Oracle has the object relational mapping as I suggested it,
expect the child nodes of the table is ROW, which is much more logical
and it uses an XQuery extension ora:view() instead of doc(). Integration
of an XQuery statement in an SQL query is also possible as IBM DB2 does.
In any case, Oracle uses a specific keyword, XQuery, to select a
different parser. I really think that is the way to go, regardless of
you do or do not want to embed the XQuery statement.
Best regards,
Arnold Daniels
Ken Jacobs wrote:
Arnold, you wrote:
I'm not aware that Oracle has XQuery support in their relational
database. As far as I know they only support that in a specific
Oracle XML DB and in Berkeley XML DB. To my knowledge, the only
mayor DB that supports this is IBM DB2 and they don't do
relational mapping in XQuery. Instead they do an SQL query with
and import of XML residing in a column to be used in the XQuery
statement. However, if you want a pure XQuery solution you will
need mapping.
Oracle does indeed have XQuery support in the relational database, and
has had since Oracle9i, some years back. Oracle was the FIRST
relational database to do so. This is NOT a separate server,
separate store or separate system at all, but is tightly integrated
with the relational database. It supports XPath expressions, XQuery,
an XML schema and a repository model. You can use SQL to access XML
data or XML to access relational data. With the recently-announced
Oracle11g, there are now three options for storing XML data:
object/relational (shredded), BLOB, and a new optimized binary XML
format. Each serves a different use case. I believe Oracle's XML
capability has far more functionality and performance, and has a track
record of much broader and significant customer usage, than IBM's DB2
XML extender (which, unlike Oracle's product) is not free ...
See the Oracle XMLDB home page
<http://www.oracle.com/technology/tech/xml/xmldb/index.html> for more
info.
Thought you'd want to know.
Regards,
Ken
Arnold Daniels wrote:
Eric Prud'hommeaux wrote:
* Arnold Daniels <[EMAIL PROTECTED]> [2007-09-08 18:11-0400]
Hi Eric,
== API stuff ==
I'm not fully agreeing with you here.
You can't strongly disagree with me 'cause i don't have a strong
opinion. I have a vague preference for the approach I've taken, and
will defend it 'till I'm dead^h^hbored. Seriously, I appreciate
this discussion.
Aren't you even considering, I might just convince you ;).
I think changing the API just
has to big of an impact on all the different clients. Let's say
you're use ODBC or PDO in PHP. There's no way to implement that
neatly. I really don't like automatic selection either cause it's
to easy to mess up.
My uninformed guess is that PHP, DBI, et al are using mysql_query. The
deployment challenge in that case is to add a call for the new API
entry, mysql_send_query, which is like mysql_query but takes an extra
parameter. Likewise, ODBC's executeQuery function would need to link
to mysql_send_query and have some settable var to indicate the
language code to use.
The point here was not about the examples. But there are a few mysql
clients out there: ODBC, /J, native PHP, etc. On top of those there
are hundreds of other drivers, usually multiple for each programming
language. All of these would need to be changed to support parser
switching. Now on top of those there are thousand and thousands of DB
abstraction classes and libs. All of those would need to be changed
as well.
Besides that, the API off all of these clients can't break
compatibility. In many cases that means that having a second
parameter to choose the parser is out of the question. Adding a
function like you did for the mysql client isn't a possibility for
most clients either, since they are data access abstraction layers,
having to conform to a specific API. Sure in most cases you can come
up with a workaround. But it will be a huge mess.
If you don't like to integrate the parser, perhaps a good solution
is to select it with a local setting, so you could do:
SET LOCAL query_parser=PARSER_SPASQL;
SELECT ?s WHERE { ?s <foo.bar> "hibbyhop" };
The problem with that is getting back. SET (LOCAL|GLOBAL) is parsed
SQL parser. Each parser would have to implement its own way of getting
back or you'd lose the flexibility of being able to intersperse
queries.
Each parser would need to implement the SET command, I don't see a
problem there. Implementing a specific command `PARSER SPASQL`, could
also work. Though not to add yet another non ANSI keyword, something
like `SET PARSER SPASQL` would be a better alternative. That way you
don't need to implement SET in each parser. Though I think having set
in each parser would be a good idea, since is it the way to control
how MySQL acts and you want to be able to do that no matter what type
of query your sending.
== XQuery stuff ==
I don't see the use of just mapping the relational data to XQuery
like you did in the example (and how do you see a join in that?).
XQuery is useful if you have XML as a string in a column. If you
need it in XML form going back and forth from XML to relational
data can be a drag. But if you want to use relational data most of
the time, switching to a pure XMLDB isn't an option either. Hence
the DB2 solution.
Generally, the appeal of querying relational data as XQuery is less
appealing to the SQL-heads than the XQuery-heads. The XQuery vision,
like the SPARQL vision, is that there is a unified data model that all
data is projected into. At that point, you can do queries that join
data in HTML documents, spreadsheets, databases, tea leaves and goat
entrails (still in the research phase).
That could be nice, but it doesn't exist yet. I'm not to interested
in standards in research phase, because it will take years and years
before we will see something a standard. Currently XQuery is used to
query XML. It uses doc() to select the source, though MySQL doesn't
work with document based storage engines, they work with tables,
columns and rows. However in a cell there might be XML data,
therefore integrating XQuery in SQL is far more logical.
I think the preference for XQuery as the outside language stems mostly
from the use of URIs as global identifiers (while MySQL allows you to
specify a database in any field spec, it's not a global identifier).
However, I'm not hoping to convince folks here to switch to XQuery or
SPARQL, just that there are people who want to query MySQL data that
way.
In this scenario what exactly would be the advantage of adding XQuery
to MySQL. I could just use Berkeley DB XML if I want to exclusively
choose for XQuery.
I guess you could imagine each row to be a node and do
doc(mytable)[/acolumn/text()='banana']/mycolumn/products//[EMAIL PROTECTED]'casual']
to get to a pure XQuery solution. I personally like the solution of
DB2 better though. Or do you have another option?
The way I envisioned this mapping is that elements represent
attributes of tuple, so nested attributes were attributes of
attributes, and therefore joins. I'm not swapped in on the industry
practice in XQuery/relational mappings, though I'll pester the Oracle
folks in the XQuery WG for more info.
If you map relational data that way, content of the table will be
seen just as that. You would want to use XQuery if you're dealing
with XML, which will reside in a specific cell. If you would
implement it this way, you still can query that XML, loosing the
whole purpose.
I'm not aware that Oracle has XQuery support in their relational
database. As far as I know they only support that in a specific
Oracle XML DB and in Berkeley XML DB. To my knowledge, the only mayor
DB that supports this is IBM DB2 and they don't do relational mapping
in XQuery. Instead they do an SQL query with and import of XML
residing in a column to be used in the XQuery statement. However, if
you want a pure XQuery solution you will need mapping.
I like DB2s solution much better and therefore I think that allowing
additional parsers to be integrated in the current parser would be
the best solution. Not only do you not have to do relational mapping
where it doesn't belong, it also solves the API problem discussed
earlier.
If you asked the same question about SPARQL, I could do a better job
answering your question as that's the sort of code I write.
I don't know enough about SPARQL to ask intelligent questions about it.
Best regards,
Arnold
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php