Jena: Getting an empty result set - java

I am getting an empty result set when I try to retrieve the data stored in a jena model.
This is the code to load the data (I have removed the imports for brevity)
package basic;
//imports here
public class DataLoaderQn {
public static void main(String[] args) throws FileNotFoundException {
String resourceURI = "http://www.abc123.com/riskmodelling/static/risks";
String directory = "D:/mywork/dp/projs/static-risks/data/test";
Dataset dataset = TDBFactory.createDataset(directory);
Model model = null;
try {
dataset.begin(ReadWrite.WRITE);
model = dataset.getDefaultModel();
model.enterCriticalSection(Lock.WRITE);
model = model.removeAll();
Resource projectNatureRes = model.createResource(resourceURI+":PROJECT_NATURE");
Property projectNatureRiskProps = model.createProperty(resourceURI + ":COMPLEX_FUNCTIONALITY");
Bag projectNatureRisks = model.createBag();
projectNatureRisks.add("More defects");
projectNatureRisks.add("Effort estimation inaccurate");
projectNatureRes.addProperty(projectNatureRiskProps, projectNatureRisks);
Property migrationRiskProps = model.createProperty(resourceURI + ":MIGRATION");
Bag migrationRisks = model.createBag();
migrationRisks.add("Lack of knowledge of exsting application");
migrationRisks.add("Documentation not available");
projectNatureRes.addProperty(migrationRiskProps, migrationRisks);
model.write(System.out);
model.write(new FileOutputStream(new File(directory + "/Project_risk.ttl")), "N-TRIPLES");
model.commit();
dataset.commit();
TDB.sync(model);
} finally {
dataset.end();
model.leaveCriticalSection();
}
}
}
And this is how I read in the data from a java program
public class ReadBasicQn {
public static void main(String[] args) {
String directory = "D:/mywork/dp/projs/static-risks/data/test";
Dataset dataset = TDBFactory.createDataset(directory);
Model model = null;
ResultSet rs;
QueryExecution qexeExecution = null;
try{
/*model = ModelFactory.createDefaultModel();
TDBLoader.loadModel(model, directory + "/Project_risk.ttl");*/
model = dataset.getDefaultModel();
String queryString = "PREFIX proj: <http://www.abc123.com/riskmodelling/static/risks#> ";
queryString += "select ?risks where ";
queryString += "{proj:PROJECT_NATURE proj:COMPLEX_FUNCTIONALITY ?risks}";
String queryString2 = "SELECT * WHERE { ?s ?p ?o }";
Query q = QueryFactory.create(queryString);
qexeExecution = QueryExecutionFactory.create(q, model);
rs = qexeExecution.execSelect();
ResultSetFormatter.out(System.out, rs);
qexeExecution.close();
q = QueryFactory.create(queryString2);
qexeExecution = QueryExecutionFactory.create(q, model);
rs = qexeExecution.execSelect();
ResultSetFormatter.out(System.out, rs);
/*while(rs.hasNext()){
QuerySolution qSol = rs.nextSolution();
RDFNode n = qSol.get("risks");
System.out.println(n);
}*/
}finally{
qexeExecution.close();
}
}
}
The output of the second query (select *) from the ResultSetFormatter shows
------------------------------------------------------------------------------------------------------------------------------------------------
| s | p | o |
===================================================================================================================================================================================================
| <http://www.abc123.com/riskmodelling/static/risks:PROJECT_NATURE> | <http://www.abc123.com/riskmodelling/static/risks:COMPLEX_FUNCTIONALITY> | _:b0 |
| <http://www.abc123.com/riskmodelling/static/risks:PROJECT_NATURE> | <http://www.abc123.com/riskmodelling/static/risks:MIGRATION> | _:b1 |
| _:b0 | <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> | <http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag> |
| _:b0 | <http://www.w3.org/1999/02/22-rdf-syntax-ns#_1> | "More defects" |
| _:b0 | <http://www.w3.org/1999/02/22-rdf-syntax-ns#_2> | "Effort estimation inaccurate" |
| _:b1 | <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> | <http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag> |
| _:b1 | <http://www.w3.org/1999/02/22-rdf-syntax-ns#_1> | "Lack of knowledge of exsting application" |
| _:b1 | <http://www.w3.org/1999/02/22-rdf-syntax-ns#_2> | "Documentation not available" |
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
which means data is available and correctly loaded (correct ?). The custom query however returns the following output.
---------
| risks |
=========
---------
Any help is appreciated. I have just about started with Jena, so maybe I am doing something really foolish.

There's a typo. Your prefix ends in #, but in your URIs, there's a :. Here's your prefix declaration and URI, lined up:
prefix proj: http://www.abc123.com/riskmodelling/static/risks#>
http://www.abc123.com/riskmodelling/static/risks:PROJECT_NATURE
^
|
In your URI, it's risks[COLON]PROJECT_NATURE, not risks[HASH]PROJECT_NATURE. You need to change your prefix to:
prefix proj: http://www.abc123.com/riskmodelling/static/risks:>
or change your data to
Resource projectNatureRes = model.createResource(resourceURI+"#PROJECT_NATURE");
// ...and in a few other places, too

I had a similar issue, but for me it came from a corrupt TDB Dataset that early on didn't throw an exception but returned results similar to the OP. Another variation of a strange result is a blank row in place of a result that I received. I was forced to rebuild the Dataset from the original source again once I received the Impossible Large Object exception. So if you see weird results, rebuilding the dataset from scratch (clearing previously existing Dataset files from the HDD) might be one way to go, depending on your situation of course.

Related

Reading XML and Creating Multiple Tables

I have an XML input file that looks like:
<mbean className="OperatingSystem">
<attribute>
<attributeName>Arch</attributeName>
<formatter>STRING</formatter>
</attribute>
<attribute>
<attributeName>ProcessCpuLoad</attributeName>
<formatType>PERCENT</formatType>
</attribute>
</mbean>
I've created a POJO called 'Mbeans' that looks like:
#XmlRootElement(name = "mbean")
#XmlAccessorType(XmlAccessType.FIELD)
public class Mbean
{
#XmlElement(name = "attribute")
private List<Attribute> attributes = null;
#XmlAttribute(name = "className")
private String className;
public String getClassName() {
return className;
}
}
I can successfully unmarshall my XML File into this POJO and my application can use this object as needed. This input file tells me the information I need to pull from a particular MBean I have. Is there a way to create multiple tables based on the XML file, such that when I pull said information I can store that information into said table structure and then use JDBC to create SQL tables on my H2 database?
For example, I would like to create tables that look like:
+------------------------+
| MBeans |
+------+-----------------+
| ID | MBeanName |
+------+-----------------+
| 1 | OperatingSystem |
+------+-----------------+
+--------------------------------+
| Attributes |
+------+--------+----------------+
| ID | MbeanId| AttributeName |
+------+--------+----------------+
| 1 | 1 | Arch |
+------+--------+----------------+
| 2 | 1 | ProcessCpuLoad |
+------+--------+----------------+
+------------------------------------+
| OperatingSystem.Arch |
+------+--------+------------+-------+
| ID | MbeanId| AttributeId| Value |
+------+--------+------------+-------+
| 1 | 1 | 1 | amd64 |
+------+--------+------------+-------+
| 2 | 1 | 1 | amd64 |
+------+--------+------------+-------+
+------------------------------------+
| OperatingSystem.ProcessCpuLoad |
+------+--------+------------+-------+
| ID | MbeanId| AttributeId| Value |
+------+--------+------------+-------+
| 1 | 1 | 2 | 0.009 |
+------+--------+------------+-------+
| 2 | 1 | 2 | 0.0691|
+------+--------+------------+-------+
I would first make :
A method mapping className into table name public String getTableName(String className)
A method mapping attributeName into clomun name public String getColumnName(String attributeName)
A method mapping formatType or formatter into the database types public String getType(String formatType)
and then
public void createTable(Mbean bean) throws SQLException{
String sql = getCreateTable(bean);
// execute SQL using JDBC...
}
private String getCreateTable(Mbean bean) {
String sqlStart = "CREATE TABLE " + getTableName(bean.getClassName()) + " (" ;
return bean.getAttributes().stream()
.map(attribute -> mapToColumn(attribute))
.collect(Collectors.joining(", ", sqlStart, ")"); // what about primary key?
}
private String mapToColumn(Attribute a) {
return getColumnName(a.getName()) + " " + getType(/*it depends*/);
}

Parsing SPARQL Result into jtable

I'm working on an Apache Jena project. I've got a Fuseki server running on my localhost.
I want to create a Java Program for my Fuseki server, that shows all the data in the triplestore in a JTable. I just have no idea how to parse the result from my query into a JTable.
My code sofar:
(left out the part where the window, table, frame etc is created)
private void Go() {
String query = "SELECT ?subject ?predicate ?object \n" +
"WHERE { \n" +
"?subject ?predicate ?object }";
Query sparqlQuery = QueryFactory.create(query, Syntax.syntaxARQ) ;
QueryEngineHTTP httpQuery = new QueryEngineHTTP("http://localhost:3030/AnimalDataSet/", sparqlQuery);
ResultSet results = httpQuery.execSelect();
System.out.println(ResultSetFormatter.asText(results));
while (results.hasNext()) {
QuerySolution solution = results.next();
}
httpQuery.close();
}
The sysout prints this, which is the correct data:
-------------------------------------------------------------------------------------------------------------------------------------
| subject | predicate | object |
=====================================================================================================================================
| <urn:animals:data> | <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> | <http://www.w3.org/1999/02/22-rdf-syntax-ns#Seq> |
| <urn:animals:data> | <http://www.w3.org/1999/02/22-rdf-syntax-ns#_1> | <urn:animals:lion> |
| <urn:animals:data> | <http://www.w3.org/1999/02/22-rdf-syntax-ns#_2> | <urn:animals:tarantula> |
| <urn:animals:data> | <http://www.w3.org/1999/02/22-rdf-syntax-ns#_3> | <urn:animals:hippopotamus> |
| <urn:animals:lion> | <http://www.some-ficticious-zoo.com/rdf#name> | "Lion" |
| <urn:animals:lion> | <http://www.some-ficticious-zoo.com/rdf#species> | "Panthera leo" |
| <urn:animals:lion> | <http://www.some-ficticious-zoo.com/rdf#class> | "Mammal" |
| <urn:animals:tarantula> | <http://www.some-ficticious-zoo.com/rdf#name> | "Tarantula" |
| <urn:animals:tarantula> | <http://www.some-ficticious-zoo.com/rdf#species> | "Avicularia avicularia" |
| <urn:animals:tarantula> | <http://www.some-ficticious-zoo.com/rdf#class> | "Arachnid" |
| <urn:animals:hippopotamus> | <http://www.some-ficticious-zoo.com/rdf#name> | "Hippopotamus" |
| <urn:animals:hippopotamus> | <http://www.some-ficticious-zoo.com/rdf#species> | "Hippopotamus amphibius" |
| <urn:animals:hippopotamus> | <http://www.some-ficticious-zoo.com/rdf#class> | "Mammal" |
-------------------------------------------------------------------------------------------------------------------------------------
I really hope someone here knows how to parse the data from the query into a JTbale :D
Thanks in advance!
I've done some further research and finally found the solution! It's quite easy actually.
You just simply change the while loop like this:
while(rs.hasNext())
{
QuerySolution sol = rs.nextSolution();
RDFNode object = sol.get("object");
RDFNode predicate = sol.get("predicate");
RDFNode subject = sol.get("subject");
DefaultTableModel model = (DefaultTableModel) table.getModel();
model.addRow(new Object[]{subject, predicate, object});
}
And that works fine for me!
For everyone who's interested, i've puplished my version as it is now to pastebin which has comments:
The link to the full (current) version of my project

Spring,Hibernate with mysql image is not displaying properly

Yesterday I have posted this question..But did not get any answer.
In my project I have stored image file in mysql database.
the table is like:
+-----------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------------+------+-----+---------+----------------+
| upload_id | int(11) | NO | PRI | NULL | auto_increment |
| uId | int(20) unsigned | NO | MUL | NULL | |
| file_name | varchar(128) | YES | | NULL | |
| file_data | longblob | YES | | NULL | |
+-----------+---------------------+------+-----+---------+----------------+
Now I am fetching image data my dao class is:--
public List<ImageClass> fetchallimage(int uId) {
ImageClass imageClass= new ImageClass(uId);
String hql = "FROM ImageClass WHERE uId = :uId1 ";
Query query = (Query) sessionFactory.getCurrentSession().createQuery(hql).setParameter("uId1", imageClass.getUserId());
return query.list();
}
My ImageClass is:--
#Table(name = "imageStore")
public class ImageClass{
private long id;
private String fileName;
private byte[] data;
---getters and settrs with #Column annotations----
}
My controller class is:-
#RequestMapping(method = RequestMethod.GET)
public String ImageFetch(Map<String, Object> map,HttpServletRequest request,
HttpSession session,HttpServletResponse response) {
int uid= (int) session.getAttribute("uId");
List<ImageClass> imageClass;
imageClass= PicService.fetchallimage(uid);
map.put("image",imageClass);
return "account";
}
}
and jsp page is:-
<c:forEach items="${image}" var="info">
<div style="width:380px;display:block;text-align:center;">
<img src="${info.data}"
border="0" alt="Dating" style="margin:10px;padding:15px;border:10px solid #FEB4DE;background:#FECDE9;"></div>
</c:forEach>
But the picture is displaying,like below:-
In page image looks like: [B#1284b24
why??what I have to do to achieve the image??Please guys suggest me.
I have edited :--
for (ImageClass temp : imageClass) {
byte[] encodeBase64 = Base64.encode(temp.getData());
String base64Encoded = new String(encodeBase64, "UTF-8");
map.put("image",base64Encoded); }
and in jsp :--<img src="data:image/jpeg;base64,${image}" />
still not getting picture.
in logger I am getting output:--
You have to convert that imageTo String and then you can easily display in JSP. I presume its a byte[]. Use a #Transient variable, it will help :
import sun.misc.BASE64Encoder;
BASE64Encoder base64Encoder = new BASE64Encoder();
object.setTransientString("data:image/png;base64," + base64Encoder.encode(object.getByteArrayDataVariable()));
In jsp, use the img tag and put the String variable there. Enjoy.

Using cassandra triggers

I'm have a cassandra table like this:
keyspace_name| columnfamily_name | column_name | component_index |
-------------+-------------------+-------------+-----------------+
aw | test | as_of_date | 0 |
aw | test | data | 1 |
aw | test | record_id | null |
aw | test | upload_time | 1 |
And I'm won't to create trigger that will print(slf4j for example) rows that whould be inserted in next format:
key = key1
column_name1=value1
column_name2=value2
...
column_namen=valuen
Is it possible to get column name in trigger?
I try example from the internet, but it prints incorrect data.
public Collection<RowMutation> augment(ByteBuffer key, ColumnFamily update) {
String localKey = new String(key.array(), Charset.forName("UTF-8"));
logger.info("key={}.", localKey);
for (Column cell : update) {
try {
String name = ByteBufferUtil.string(cell.name());
logger.info("name={}.", name);
String value = ByteBufferUtil.string(cell.value());
logger.info("value={}.", value);
} catch (Exception e) {
logger.info("Exception={}.", e.getMessage());
}
}
As I understand, i am must convert cell.value() to specific data type like this:
Date date = TimestampType.instance.compose(cell.value());
But I don't know, how to detect field type and i am don't understand why i can't get column name using ByteBufferUtil.string(cell.name()).
To properly format cellname and values you must use the CFMetaData. The correct version of the code should be:
public Collection<Mutation> augment(ByteBuffer key, ColumnFamily update)
{
CFMetaData cfm = update.metadata();
String localKey = cfm.getKeyValidator().getString(key);
logger.info("key={}.", localKey);
for (Cell cell : update)
{
try
{
String name = cfm.comparator.getString(cell.name());
logger.info("name={}.", name);
String value = cfm.getValueValidator(cell.name()).getString(cell.value());
logger.info("value={}.", value);
} catch (Exception e) {
logger.info("Exception={}.", e.getMessage());
}
}
return Collections.emptyList();
}

List the child nodes in tree when parent expanded

I have a problem in implementing the tree structure of OID. when I click the parent , i need to display only child details, not the sub child of a child.
i.e., i need not display an OID which contains a "." (dot).
For example, if my OID structure is private.MIB.sample.first
private.MIB.sample.second and so on.
when I click on MIB, it should display only "sample" not first and second.
first and second is to be displayed when I click sample.
How can I implement this in java.
My datyabase is MySQL. The code which I tried is given below
FilteredRowSet rs = new FilteredRowSetImpl();
// for Other Types Like OBJECT-TYPE, Object_IDENTIFIER
rs = new FilteredRowSetImpl();
rs.setCommand("Select * from MIBNODEDETAILS where " + "mn_OID like '" + OID
+ ".%' order by mn_NodeType, mn_OID");
rs.setUrl(Constants.DB_CONNECTION_URL);
rs.setFilter(new MibRowFilter(1, expString));
rs.execute();
rs.absolute(1);
rs.beforeFirst();
I guess the change is to be made in the setCommand argument.
How can I do this?
Structure of mobnodedetails table
+--------------------+-------------------+-------------+
| mn_OID | mn_name | mn_nodetype |
+--------------------+-------------------+-------------+
| 1 | iso | 0 |
| 1.3 | org | 1 |
| 1.3.6 | dod | 1 |
| 1.3.6.1 | internet | 1 |
| 1.3.6.1.1 | directory | 1 |
| 1.3.6.1.2 | mgmt | 1 |
| 1.3.6.1.2.1 | mib-2 | 0 |
| 1.3.6.1.2.1.1 | system | 1 |
| 1.3.6.1.2.1.10 | transmission | 1 |
You can use something like
SELECT *
FROM mibnodedetails
WHERE mn_oid LIKE "+mn_OID+"%
AND LENGTH ("+mn_OID+") + 2 = LENGTH (mn_oid)
ORDER BY mn_nodetype, mn_oid
So if you pass mm_OID as 1.3.6.1 (|1.3.6.1 |internet |1 |)
You will get following result:
| 1.3.6.1.1 | directory | 1 |
| 1.3.6.1.2 | mgmt | 1 |
Working Demo
PS: This will not work for child more than 9 as we are using length + 2
The function given below dispalys the tree as required.
public void populateMibValues()
{
final DefaultTreeModel model = (DefaultTreeModel) this.m_mibTree.getModel();
model.setRoot(null);
this.rootNode.removeAllChildren();
final String query_MibNodeDetailsSelect = "Select * from MIBNODEDETAILS where LENGTH(mn_oid)<=9 "
+ " and mn_OID<='1.3.6.1.4.1' order by mn_OID"; // only
this.innerNodeNames.clear();
this.innerNodes.clear();
this.innerNodesOid = null;
try {
final ResultSet deviceRS = Application.getDBHandler().executeQuery(query_MibNodeDetailsSelect, null);// inner
// nodes
while (deviceRS.next()) {
final mibNode mb = new mibNode(deviceRS.getString("mn_OID").toString(), deviceRS.getString("mn_name")
.toString());
mb.m_Type = Integer.parseInt(deviceRS.getString("mn_nodetype").toString());
createMibTree(mb);
}
}
catch (final Exception e) {
Application.showErrorInConsole(e);
NmsLogger.writeErrorLog("ERROR creating MIB tree failed", e.toString());
}

Categories

Resources