In case of the SQL query, which I'm using in this case, for your working
solution it will traverse the 'in' connection twice I think. When we get
the account object via in('Employs')[0] as account we get the full object
with the @rid so I find it limiting that Orient doesn't allow to retrieve
rid from it.
Is there a way to get it in a single traversal or is it just not possible?
The reason its important for us because we'll have other similar queries
that can go deeper in traversals and really need to avoid the multiple
traversals.
On Thursday, December 1, 2016 at 7:36:05 PM UTC-8, Ivan Mainetti wrote:
>
> well, getProperty returns something very similar actually
>
> System.out.println("3 " + d.getProperty("account.@rid"));
> System.out.println("3 " + d.getProperty("account"));
>
> 3 v(Account)[#25:0]
> 3 v(Account)[#25:0]
>
>
> But! I've found this!
> String query = "select name, in('Employs')[0] as account,
> in('Employs')[0].asString() as accRid from user where name = ?";
>
> System.out.println("3 " + d.getProperty("accRid"));
> //System.out.println("3 " + d.field("accRid"));
>
> --
> 3 #25:0
>
>
>
>
> Il giorno venerdì 2 dicembre 2016 04:21:39 UTC+1, Borov ha scritto:
>>
>> I did, but it doesn't work. It pulls the entire 'account' object.
>>
>> System.out.println("acc rid = "+ d.field("account.@rid"));
>> System.out.println("acc rid = "+ d.field("account"));
>>
>> acc rid = Account#25:0{...}
>> acc rid = Account#25:0{...}
>>
>>
>>
>> On Thursday, December 1, 2016 at 1:34:04 PM UTC-8, Ivan Mainetti wrote:
>>>
>>> Did you try with one of these?
>>>
>>> d.field("account.@rid")
>>>
>>> d.field("account")
>>>
>>>
>>>
>>>
>>> Il giorno giovedì 1 dicembre 2016 20:36:01 UTC+1, Borov ha scritto:
>>>>
>>>> Hi Ivan,
>>>>
>>>> In my original logic "d" is of type ODocument (
>>>> http://orientdb.com/javadoc/2.2.x/com/orientechnologies/orient/core/record/impl/ODocument.html)
>>>>
>>>> and it doesn't have .getProperty(...) method.
>>>>
>>>> Can I get the account.@rid from the SQL API and not the Graph API?
>>>>
>>>>
>>>>
>>>> On Wednesday, November 30, 2016 at 3:14:43 PM UTC-8, Ivan Mainetti
>>>> wrote:
>>>>>
>>>>> using getProperty, like in my example code, you can do
>>>>> System.out.println("3 " + d.getProperty("account.@rid"));
>>>>>
>>>>> I don't know if it works even with *field()* method
>>>>>
>>>>>
>>>>> Il giorno mercoledì 30 novembre 2016 23:28:26 UTC+1, Borov ha scritto:
>>>>>>
>>>>>> One more question,
>>>>>>
>>>>>> What is the way to get account @rid from this field "in('Employs')[0]
>>>>>> as account"? I can get all fields, but not the @rid.
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Monday, November 28, 2016 at 2:42:13 PM UTC-8, Ivan Mainetti wrote:
>>>>>>>
>>>>>>> Hi,
>>>>>>>
>>>>>>> in('Employs') returns a list, if you know that it can be only one
>>>>>>> document in it you can try modifying your query adding *[0]*
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> *String sql = " select @rid.asString() as userRid,
>>>>>>> firstName, lastName, " + " active as userActive,
>>>>>>> in('Employs')[0] as account " + "from User " +
>>>>>>> "where
>>>>>>> email = ? and password = ?";*
>>>>>>>
>>>>>>> *EDIT*
>>>>>>>
>>>>>>> Alternatively you can change a little your code as follow (I've
>>>>>>> simplified the query just for testing):
>>>>>>>
>>>>>>> String dbName = "stack40732762";
>>>>>>>
>>>>>>> OrientGraphFactory dbfactory = new
>>>>>>> OrientGraphFactory("remote:127.0.0.1:2424/"+dbName, "root",
>>>>>>> "root").setupPool(1, 50);
>>>>>>>
>>>>>>> OrientGraph db = dbfactory.getTx();
>>>>>>> // ODatabaseDocumentTx db = DbPool.getConnection()
>>>>>>>
>>>>>>> try {
>>>>>>> String query = "select name, in('Employs')[0] as
>>>>>>> account from user where name = ?";
>>>>>>> //
>>>>>>> // OSQLSynchQuery<ODocument> query = new
>>>>>>> OSQLSynchQuery<>(sql);
>>>>>>> // List<ODocument> result =
>>>>>>> db.command(query).execute();
>>>>>>> Iterable<OrientVertex> result = db.command(new
>>>>>>> OCommandSQL(query)).execute("pippo");
>>>>>>>
>>>>>>> while(result.iterator().hasNext()){
>>>>>>> OrientVertex d = result.iterator().next();
>>>>>>>
>>>>>>> // System.out.println("1 "+
>>>>>>> d.field("account.id")); // <-- fails here
>>>>>>> System.out.println("1 " +
>>>>>>> d.getProperty("account.id")); // <-- this works!
>>>>>>> // System.out.println("2 "+
>>>>>>> d.field("name"));
>>>>>>> System.out.println("2 " +
>>>>>>> d.getProperty("name"));
>>>>>>> }
>>>>>>>
>>>>>>>
>>>>>>> } catch (Exception e) {
>>>>>>> // TODO: handle exception
>>>>>>> System.out.println(e);
>>>>>>> }
>>>>>>>
>>>>>>>
>>>>>>> Bye,
>>>>>>>
>>>>>>> Ivan
>>>>>>>
>>>>>>>
>>>>>>> Il giorno lunedì 28 novembre 2016 21:09:14 UTC+1, Borov ha scritto:
>>>>>>>>
>>>>>>>> Hi guys, I posted this question on stackoverflow
>>>>>>>> <http://stackoverflow.com/questions/40732762/orientdb-cant-select-data-from-connected-document>
>>>>>>>> last
>>>>>>>> week, but didn't get an answer, so I decided to re-posted it here.
>>>>>>>>
>>>>>>>>
>>>>>>>> *Using OrientDB v2.2.12*. I'm trying to execute a simple sql query
>>>>>>>> to retrieve data from the document searched as well as few properties
>>>>>>>> of a
>>>>>>>> connected document. But, for some reason ran into a dead wall on how
>>>>>>>> to
>>>>>>>> select the property *from the connected document*. Here is my
>>>>>>>> simple scenario:
>>>>>>>>
>>>>>>>>
>>>>>>>> I have 2 documents, an Account and a User. Account document has an
>>>>>>>> edge to a User named 'Employs'. I'm trying to login a user by email
>>>>>>>> and
>>>>>>>> password. If record for the user is found, I simply need to get some
>>>>>>>> user
>>>>>>>> data from the User class (works fine) and few properties from an
>>>>>>>> account
>>>>>>>> document (doesn't work right) to be stored in user's session.
>>>>>>>>
>>>>>>>>
>>>>>>>> Here is my query:
>>>>>>>>
>>>>>>>>
>>>>>>>> try (ODatabaseDocumentTx db = DbPool.getConnection()) {
>>>>>>>> String sql
>>>>>>>> = " select @rid.asString() as userRid, firstName,
>>>>>>>> lastName, "
>>>>>>>> + " active as userActive, in('Employs') as account "
>>>>>>>> + "from User "
>>>>>>>> + "where email = ? and password = ?";
>>>>>>>>
>>>>>>>> OSQLSynchQuery<ODocument> query = new OSQLSynchQuery<>(sql);
>>>>>>>> List<ODocument> result =
>>>>>>>> db.command(query).execute('[email protected]', 'abc');
>>>>>>>>
>>>>>>>> ODocument d = result.get(0);
>>>>>>>>
>>>>>>>> System.out.println("1 "+ d.field("account.id")); // <-- fails
>>>>>>>> here
>>>>>>>> System.out.println("2 "+ d.field("userRid"));
>>>>>>>> System.out.println("3 "+ d.field("account.company")); // <-- fails
>>>>>>>> here
>>>>>>>> System.out.println("4 "+ d.field("firstName"));
>>>>>>>> System.out.println("5 "+ d.field("lastName"));
>>>>>>>> System.out.println("6 "+ d.field("account.active")); // <-- fails
>>>>>>>> here
>>>>>>>> System.out.println("7 "+ d.field("userActive"));
>>>>>>>>
>>>>>>>> return new SessionUser(
>>>>>>>> d.field("account.id"),
>>>>>>>> d.field("userRid"),
>>>>>>>> d.field("account.company"),
>>>>>>>> d.field("firstName"),
>>>>>>>> d.field("lastName"),
>>>>>>>> d.field("account.active"),
>>>>>>>> d.field("userActive"));
>>>>>>>> }
>>>>>>>>
>>>>>>>>
>>>>>>>> It fails to create the SessionUser object. More specifically, it
>>>>>>>> fails on retrieval of the account properties. Here is how the data
>>>>>>>> looks in
>>>>>>>> System.out:
>>>>>>>>
>>>>>>>>
>>>>>>>> 1 [17]
>>>>>>>> 2 #37:0
>>>>>>>> 3 [Seller 1]
>>>>>>>> 4 Mike
>>>>>>>> 5 Maloney
>>>>>>>> 6 [true]
>>>>>>>> 7 true
>>>>>>>> WARN : 2016-11-21 17:53:53,036 WARN c.t.e.k.c.ExceptionHandler -
>>>>>>>> Error: java.util.LinkedHashSet cannot be cast to java.lang.Integer
>>>>>>>>
>>>>>>>>
>>>>>>>> *Here is how a single account.id <http://account.id> property looks
>>>>>>>> like in the debugger*
>>>>>>>>
>>>>>>>>
>>>>>>>> <https://lh3.googleusercontent.com/-YOuTE7s3Nkw/WDyMiR8VZkI/AAAAAAAAAAw/a9h1gGLIq4wmpCHi6rbAjF1DjnfddNhyQCLcB/s1600/Screen%2BShot%2B2016-11-21%2Bat%2B5.48.02%2BPM.png>
>>>>>>>>
>>>>>>>>
>>>>>>>> I do see that the account properties are coming in as objects, just
>>>>>>>> can't figure out how to select them easy. I didn't want to go through
>>>>>>>> manually casting list then set, etc. to get to a simple account.id
>>>>>>>> element. I'm sure there is a straight forward way, just can't see it.
>>>>>>>> For
>>>>>>>> example, if I can't use this d.field("account.id") then how do I
>>>>>>>> get the ID 17?
>>>>>>>>
>>>>>>>>
>>>>>>>> What is the right way to select data of a connected document? Or,
>>>>>>>> is there a better way to construct the query itself?
>>>>>>>>
>>>>>>>>
>>>>>>>> Thanks.
>>>>>>>>
>>>>>>>>
--
---
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.