Hello, guys!
I am using Stardog to hold some data located in Databricks. I have successfully connected Databricks to Stardog and created a virtual graph. I can query the Graph using both SPARQL in Stardog Studio and GraphQL by forming a request via Python.
I need to figure out how to do this: let's say we have a Class in RDF, in GraphQL it is a Type named 'Type1A'. This class has a property (RDF) / field (GrapQL) named 'Field1A'. Inside this field, string values are saved. And let's say there are multiple instances of this node/object, thus getting us to many string values 'aba', 'bab', 'abc', 'ababa', etc. in the field 'Field1A'. My goal is to return all full 'Field1A' values that contain a substring 'aba', so in our case -> 'aba', 'ababa' should be returned (sorry for the silly examples, I hope it is understandable).
I have tried to query using GraphQL, and sending this query via Python, requests module:
"""
query {
Type1A(filter: {Field1A: {contains: "aba"}}) {
nodes {
Field1A
}
}
}
"""
Sadly, to no prevail, as I am getting an error:
{'errors': [{'extensions': {'classification': 'ValidationError'},
'locations': [{'column': 28, 'line': 3}],
'message': 'Validation error of type UnknownArgument: Unknown '
"field argument filter @ 'Type1A'"},
{'extensions': {'classification': 'ValidationError'},
'locations': [{'column': 13, 'line': 4}],
'message': 'Validation error of type FieldUndefined: Field '
"'nodes' in type 'Type1A' is undefined @ "
"'Type1A/nodes'"}]}
Obviously, I understand that inside my GraphQL schema I should have defined nodes from this error. However, I cannot neither use arguments to filter fields in my graph using GrapQL nor filter by using 'filter' function. So let's leave it at that, it is a whole another story
I have tried running a SPARQL query in the studio:
SELECT ?obj_0 ?Field1A
FROM <virtual://my_virtual_graph_name>
WHERE {
?obj_0 a <real_class_url> .
?obj_0 <real_class_url#Field1A> ?Field1A .
FILTER(CONTAINS(LCASE(?Field1A), "aba"))
}
This returns me exactly what I want, the obj_0 of the class/type Type1A and all of the values from Field1A that contain "aba".
If I try to run this query using Stardog CLI tool with this command:
./stardog query my-db-name "SELECT ?obj_0 ?Field1A FROM <virtual://my_virtual_graph_name> WHERE { ?obj_0 a <real_class_url> . ?obj_0 <real_class_url#Field1A> ?Field1A . FILTER(CONTAINS(LCASE(?Field1A), "aba")) }" --server https://my_stardog_endpoing.stardog.cloud:5820 --username 'username_value' --passwd 'password_value'
I always get a message Connection refused, and if I run it with --verbose argument:
The detailed stack trace for the error is:
com.complexible.stardog.cli.CliException: Connection refused
at com.complexible.stardog.cli.impl.ConnectionCommand.call(ConnectionCommand.java:87)
at com.complexible.stardog.cli.CLIBase.execute(CLIBase.java:56)
at com.complexible.stardog.cli.CLI.main(CLI.java:121)
Caused by: com.complexible.stardog.server.StardogConnectionException: Connection refused
at com.complexible.stardog.protocols.http.client.Client.toStardogException(Client.java:113)
at com.complexible.stardog.protocols.http.client.Client.toStardogException(Client.java:101)
at com.complexible.stardog.protocols.http.client.BaseHttpClient.execute(BaseHttpClient.java:407)
at com.complexible.stardog.protocols.http.client.HttpClientImpl.select(HttpClientImpl.java:211)
at com.complexible.stardog.protocols.http.client.HttpConnection._select(HttpConnection.java:253)
at com.complexible.stardog.api.impl.AbstractConnection.executeSelect(AbstractConnection.java:460)
at com.complexible.stardog.api.impl.SelectQueryImpl.execute(SelectQueryImpl.java:38)
at com.complexible.stardog.api.impl.SelectQueryImpl.execute(SelectQueryImpl.java:25)
at com.complexible.stardog.cli.impl.QueryWithOutput.executeTupleQuery(QueryWithOutput.java:191)
at com.complexible.stardog.cli.impl.QueryWithOutput.writeOutput(QueryWithOutput.java:103)
at com.complexible.stardog.cli.impl.Query.execute(Query.java:90)
at com.complexible.stardog.cli.impl.ConnectionCommand.execute(ConnectionCommand.java:95)
at com.complexible.stardog.cli.impl.ConnectionCommand.call(ConnectionCommand.java:75)
... 2 more
Caused by: java.net.ConnectException: Connection refused
at java.base/sun.nio.ch.Net.connect0(Native Method)
at java.base/sun.nio.ch.Net.connect(Net.java:579)
at java.base/sun.nio.ch.Net.connect(Net.java:568)
at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:576)
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327)
at java.base/java.net.Socket.connect(Socket.java:666)
at org.apache.http.conn.socket.PlainConnectionSocketFactory.connectSocket(PlainConnectionSocketFactory.java:75)
at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:376)
at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:72)
at com.complexible.stardog.protocols.http.client.BaseHttpClient.execute(BaseHttpClient.java:399)
... 12 more
I have saved the mentioned SPARQL query as a Stored Query in Stardog Studio and when I try to run a command in a terminal using that stored query, I also get a 'Connection refused' message.
Is there anything else that can be done that I could solve my problem - to filter a certain field of a certain type in a contains a substring manner not from Studio, but externally, either using Stardog CLI or, most convenient for me, via Python requests, so either SPARQL or GraphQL?