Greetings,
OrientDB : Version 2.2.28
I am facing a problem using OSQL MATCH,
Basically, we have a query language which we translate into OSQL to query
our OrientDB database.
We have to do graph pattern matching and the MATCH statement seems
perfectly appropriate for our needs (and you have all my thanks for adding
that to OrientDB ! Sincerely.), however... it does not work.
So first of all, is this the right way to use a while condition into the
MATCH statement ?
MATCH
{class:Projection, as:a} -as_ontology_class-> {as:b},
{class:owl_class, as:c, where:(ori = "http://purl.org/vso/ns#Bicycle" )} <-
isA- {class:owl_class, as:b, while:(true)}
RETURN a
What bothers me is that *"a"* may be directly linked to *"c"*, and
sometimes it must pass through *"b"* to reach *"c"* . It works most of the
time but i'm never really sure about the global method, if this should not
be split into two queries.
Example:
projection (vertex) : P1, P2
owl_class (vertex) : bicycle, bus, busOrCoach
isA (edge) : Bus -isA-> BusOrCoach
as_ontology_class (edge) : P1 -as_ontology_class-> bicycle, P2
-as_ontology_class-> Bus
If i use the following query :
MATCH
{class:Projection, as:a} -as_ontology_class-> {as:b},
{class:owl_class, as:c, where:(ori IN ["http://purl.org/vso/ns#Bicycle",
"http://purl.org/vso/ns#BusOrCoach"] )} <-isA- {class:owl_class, as:b, while
:(true)}
RETURN a
both P1 and P2 will be returned, isn't that strange ? OSQL made the
assumption for me to link directly a and c. It is good to me because that
is what i want but i can't help but wonder because this is not what i
expected.
Next, take the following dataset:
Person (vertex) : A, B, C, D
Name (property) : A.name = Alice, B.name = Bob, C.name = Charlie, D.name =
Daniel
knows (edge) :
A -knows-> B,
A -knows-> C,
B -knows-> C,
B -knows-> D,
C -knows-> A,
C -knows-> B,
D -knows-> B
With the following query :
MATCH
{class:Person, as:a} -knows-> {class:Person, as:b} -knows-> {class:Person,
as:c, where:(name NOT IN ["Daniel"] )}
RETURN a ) )
I get no person matching even though i see the pattern A -knows-> B -
knows-> C with C.name NOT IN ["Daniel"].
Now, if i add a fifth person at the farest location possible from Daniel:
Person (vertex) : A, B, C, D, E
Name (property) : A.name = Alice, B.name = Bob, C.name = Charlie, D.name =
Daniel, E.name = Ted
knows (edge) :
A -knows-> B,
A -knows-> C,
B -knows-> C,
B -knows-> D,
C -knows-> A,
C -knows-> B,
E -knows-> C
Same query :
MATCH
{class:Projection, as:a} -knows-> {class:Projection, as:b} -knows-> {class:
Projection, as:c, where:(name NOT IN ["Daniel"] )}
RETURN a ) )
For the E vertex there is no Person called Daniel within a depth of two
through the "knows" edge, still, the results are the same, no person
matching.
If i go back to the dataset without E and i change the "NOT IN" operator
with "=" :
MATCH
{class:Person, as:a} -knows-> {class:Person, as:b} -knows-> {class:Person,
as:c, where:(name != "Daniel" )}
RETURN a ) )
The query return A, B, C and D.
Why does the use of a list have such impacts onto the query what am i
missing ?
If you take the very first query :
MATCH
{class:Projection, as:a} -as_ontology_class-> {as:b},
{class:owl_class, as:c, where:(ori = "http://purl.org/vso/ns#Bicycle" )} <-
isA- {class:owl_class, as:b, while:(true)}
RETURN a
I have some cases where it fails or work depending the dataset with a
runtime exception "Invalid pattern to match!" (line 668, version 2.2.28 in
OMatchStatement)
I do not know exactly if this has some impact on the execution but when i
tried to execute in debug mode the query with pointbreaks into
OMatchStatement i saw that the order of executionPlan.sortedEdges where
inverted in the case of the query fails or succeed.
executionPlan.sortedEdges in case of failure : [ { "out" : true, "edge" :
"b->a" } , { "out" : false, "edge": "b->c" } ]
executionPlan.sortedEdges in case of success : [ { "out" : true, "edge" :
"b->c" } , { "out" : false, "edge" : "b->a" } ]
I saw it was based on some estimated size of the roots entries so I tried
to modify the dataset which fails to have the same sortedEdges ordering but
i could not manage to change the order back, so no real clue on this. Also,
after some tries i noticed that if i put a deliberately unsatisfiable
clause on *"a" *the query will be executed properly:
MATCH
{class:Projection, as:a, where:(false = true)*} -as_ontology_class-> {as:b},
*this could be anything as long as i'm sure it will never be true.
{class:owl_class, as:c, where:(ori = "http://purl.org/vso/ns#Bicycle" )}
<-isA- {class:owl_class, as:b, while:(true)}
RETURN a
I won't get any result back, but there won't be any errors.
I am very sorry if it feels fuzzy, i will try to upload a dataset tomorrow,
Thanks,
Cyprien Gottstein.
--
---
You received this message because you are subscribed to the Google Groups
"OrientDB" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.