I'm afraid there's not a direct way to get it. You may consider of
manipulate the output string from d.field("account") Account#25:0{...}
in order to extract the rid
Il giorno venerdì 2 dicembre 2016 16:42:04 UTC+1, Borov ha scritto:
>
> 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.