You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by di...@apache.org on 2021/06/01 03:03:14 UTC

[airavata-data-lake] 07/42: metadata service neo4j implementation

This is an automated email from the ASF dual-hosted git repository.

dimuthuupe pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/airavata-data-lake.git

commit 2724b9a8e90f7a66150b69b359fe319d9b9dba0e
Author: Isuru Ranawaka <ir...@gmail.com>
AuthorDate: Wed Mar 10 21:44:02 2021 -0500

    metadata service neo4j implementation
---
 airavata-data-lake.ipr                             | 112 ++++++
 airavata-data-lake.iws                             | 418 ++++++++++++++++++++
 metadata-service/data-builders/data-builders.iml   |  16 +
 metadata-service/data-builders/pom.xml             |  20 +
 metadata-service/db-service/db-service.iml         | 420 +++++++++++++++++++++
 metadata-service/db-service/pom.xml                |  49 +++
 .../datalake/metadata/db/service/AppConfig.java    | 108 ++++++
 .../db/service/Neo4JServiceInitializer.java        |  14 +
 .../metadata/db/service/XmlConfiguration.java      |   9 +
 .../metadata/db/service/backend/Connector.java     |  10 +
 .../metadata/db/service/backend/Person.java        |  74 ++++
 .../db/service/backend/neo4j/Neo4JConnector.java   |  53 +++
 .../neo4j/curd/operators/GenericService.java       |  79 ++++
 .../backend/neo4j/curd/operators/GroupService.java |   4 +
 .../neo4j/curd/operators/ResourceService.java      |   4 +
 .../neo4j/curd/operators/SearchOperator.java       |  33 ++
 .../backend/neo4j/curd/operators/Service.java      |  24 ++
 .../backend/neo4j/curd/operators/UserService.java  |   4 +
 .../service/backend/neo4j/model/nodes/Entity.java  | 109 ++++++
 .../service/backend/neo4j/model/nodes/Group.java   | 208 ++++++++++
 .../backend/neo4j/model/nodes/Resource.java        | 215 +++++++++++
 .../db/service/backend/neo4j/model/nodes/Role.java |  37 ++
 .../backend/neo4j/model/nodes/ServiceAccount.java  |  29 ++
 .../service/backend/neo4j/model/nodes/Tenant.java  | 125 ++++++
 .../db/service/backend/neo4j/model/nodes/User.java | 132 +++++++
 .../backend/neo4j/model/relationships/Belongs.java |   9 +
 .../neo4j/model/relationships/ConfiguredWith.java  |   7 +
 .../backend/neo4j/model/relationships/Has.java     |   9 +
 .../neo4j/model/relationships/HasAccess.java       |  23 ++
 .../neo4j/model/relationships/HasChildGroup.java   |   9 +
 .../model/relationships/HasChildResource.java      |   8 +
 .../neo4j/model/relationships/HasChildUser.java    |  19 +
 .../neo4j/model/relationships/HasParentGroup.java  |  19 +
 .../model/relationships/HasParentResource.java     |   7 +
 .../backend/neo4j/model/relationships/HasRole.java |   8 +
 .../neo4j/model/relationships/MemberOf.java        |  19 +
 .../neo4j/model/relationships/Relationship.java    |  81 ++++
 .../neo4j/model/relationships/SharedWith.java      |  25 ++
 .../service/exceptions/DBConnectorException.java   |  10 +
 .../src/main/resources/application.properties      |  23 ++
 .../src/main/resources/applicationContext.xml      |  12 +
 metadata-service/metadata-service.iml              |  14 +
 metadata-service/pom.xml                           | 130 +++++++
 pom.xml                                            |  77 +++-
 44 files changed, 2814 insertions(+), 1 deletion(-)

diff --git a/airavata-data-lake.ipr b/airavata-data-lake.ipr
new file mode 100644
index 0000000..3bec1ac
--- /dev/null
+++ b/airavata-data-lake.ipr
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+<project version="4" relativePaths="false"> 
+  <component name="ProjectRootManager" version="2" assert-keyword="true" project-jdk-name="11." jdk-15="true"/>  
+  <component name="CodeStyleManager"> 
+    <option name="USE_DEFAULT_CODE_STYLE_SCHEME" value="true"/>  
+    <option name="CODE_STYLE_SCHEME" value=""/> 
+  </component>  
+  <component name="libraryTable"/>  
+  <component name="CompilerConfiguration"> 
+    <option name="DEFAULT_COMPILER" value="Javac"/>  
+    <option name="CLEAR_OUTPUT_DIRECTORY" value="false"/>  
+    <!--
+    <wildcardResourcePatterns>
+      <entry name="${wildcardResourcePattern}"/>
+    </wildcardResourcePatterns>
+    -->  
+    <wildcardResourcePatterns>
+      <entry name="!?*.java"/>
+    </wildcardResourcePatterns>
+  </component>  
+  <component name="JavacSettings"> 
+    <option name="DEBUGGING_INFO" value="true"/>  
+    <option name="GENERATE_NO_WARNINGS" value="false"/>  
+    <option name="DEPRECATION" value="true"/>  
+    <option name="ADDITIONAL_OPTIONS_STRING" value=""/>  
+    <option name="MAXIMUM_HEAP_SIZE" value="128"/>  
+    <option name="USE_GENERICS_COMPILER" value="false"/> 
+  </component>  
+  <component name="JikesSettings"> 
+    <option name="DEBUGGING_INFO" value="true"/>  
+    <option name="DEPRECATION" value="true"/>  
+    <option name="GENERATE_NO_WARNINGS" value="false"/>  
+    <option name="GENERATE_MAKE_FILE_DEPENDENCIES" value="false"/>  
+    <option name="DO_FULL_DEPENDENCE_CHECK" value="false"/>  
+    <option name="IS_INCREMENTAL_MODE" value="false"/>  
+    <option name="IS_EMACS_ERRORS_MODE" value="true"/>  
+    <option name="ADDITIONAL_OPTIONS_STRING" value=""/>  
+    <option name="MAXIMUM_HEAP_SIZE" value="128"/> 
+  </component>  
+  <component name="AntConfiguration"> 
+    <option name="IS_AUTOSCROLL_TO_SOURCE" value="false"/>  
+    <option name="FILTER_TARGETS" value="false"/> 
+  </component>  
+  <component name="JavadocGenerationManager"> 
+    <option name="OUTPUT_DIRECTORY"/>  
+    <option name="OPTION_SCOPE" value="protected"/>  
+    <option name="OPTION_HIERARCHY" value="false"/>  
+    <option name="OPTION_NAVIGATOR" value="false"/>  
+    <option name="OPTION_INDEX" value="false"/>  
+    <option name="OPTION_SEPARATE_INDEX" value="false"/>  
+    <option name="OPTION_USE_1_1" value="false"/>  
+    <option name="OPTION_DOCUMENT_TAG_USE" value="false"/>  
+    <option name="OPTION_DOCUMENT_TAG_AUTHOR" value="false"/>  
+    <option name="OPTION_DOCUMENT_TAG_VERSION" value="false"/>  
+    <option name="OPTION_DOCUMENT_TAG_DEPRECATED" value="false"/>  
+    <option name="OPTION_DEPRECATED_LIST" value="false"/>  
+    <option name="OTHER_OPTIONS"/>  
+    <option name="HEAP_SIZE"/>  
+    <option name="OPEN_IN_BROWSER" value="false"/> 
+  </component>  
+  <component name="JUnitProjectSettings"> 
+    <option name="TEST_RUNNER" value="UI"/> 
+  </component>  
+  <component name="EntryPointsManager"> 
+    <entry_points/> 
+  </component>  
+  <component name="DataSourceManager"/>  
+  <component name="ExportToHTMLSettings"> 
+    <option name="PRINT_LINE_NUMBERS" value="false"/>  
+    <option name="OPEN_IN_BROWSER" value="false"/>  
+    <option name="OUTPUT_DIRECTORY"/> 
+  </component>  
+  <component name="ImportConfiguration"> 
+    <option name="VENDOR"/>  
+    <option name="RELEASE_TAG"/>  
+    <option name="LOG_MESSAGE"/>  
+    <option name="CHECKOUT_AFTER_IMPORT" value="true"/> 
+  </component>  
+  <component name="ProjectModuleManager"> 
+    <modules> 
+      <!-- module filepath="$$PROJECT_DIR$$/${pom.artifactId}.iml"/ -->  
+      <module filepath="$PROJECT_DIR$/airavata-data-lake.iml"/>
+      <module filepath="$PROJECT_DIR$/data-orchestrator/data-orchestrator-api/data-orchestrator-api.iml"/>
+      <module filepath="$PROJECT_DIR$/data-orchestrator/data-orchestrator-core/data-orchestrator-core.iml"/>
+      <module filepath="$PROJECT_DIR$/data-orchestrator/data-orchestrator.iml"/>
+      <module filepath="$PROJECT_DIR$/metadata-service/neo4j-service/neo4j-service.iml"/>
+      <module filepath="$PROJECT_DIR$/metadata-service/metadata-service.iml"/>
+    </modules> 
+  </component>  
+  <UsedPathMacros> 
+    <!--<macro name="cargo"></macro>--> 
+  </UsedPathMacros> 
+</project>
diff --git a/airavata-data-lake.iws b/airavata-data-lake.iws
new file mode 100644
index 0000000..57de9a0
--- /dev/null
+++ b/airavata-data-lake.iws
@@ -0,0 +1,418 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+<project version="4" relativePaths="false"> 
+  <component name="LvcsProjectConfiguration"> 
+    <option name="ADD_LABEL_ON_PROJECT_OPEN" value="true"/>  
+    <option name="ADD_LABEL_ON_PROJECT_COMPILATION" value="true"/>  
+    <option name="ADD_LABEL_ON_FILE_PACKAGE_COMPILATION" value="true"/>  
+    <option name="ADD_LABEL_ON_PROJECT_MAKE" value="true"/>  
+    <option name="ADD_LABEL_ON_RUNNING" value="true"/>  
+    <option name="ADD_LABEL_ON_DEBUGGING" value="true"/>  
+    <option name="ADD_LABEL_ON_UNIT_TEST_PASSED" value="true"/>  
+    <option name="ADD_LABEL_ON_UNIT_TEST_FAILED" value="true"/> 
+  </component>  
+  <component name="PropertiesComponent"> 
+    <property name="MemberChooser.copyJavadoc" value="false"/>  
+    <property name="GoToClass.includeLibraries" value="false"/>  
+    <property name="MemberChooser.showClasses" value="true"/>  
+    <property name="MemberChooser.sorted" value="false"/>  
+    <property name="GoToFile.includeJavaFiles" value="false"/>  
+    <property name="GoToClass.toSaveIncludeLibraries" value="false"/> 
+  </component>  
+  <component name="ToolWindowManager"> 
+    <frame x="-4" y="-4" width="1032" height="746" extended-state="6"/>  
+    <editor active="false"/>  
+    <layout> 
+      <window_info id="CVS" active="false" anchor="bottom" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.33" order="-1"/>  
+      <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.33" order="7"/>  
+      <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.25" order="0"/>  
+      <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.33" order="1"/>  
+      <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.25" order="1"/>  
+      <window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.33" order="-1"/>  
+      <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.4" order="6"/>  
+      <window_info id="Aspects" active="false" anchor="right" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.33" order="-1"/>  
+      <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.25" order="1"/>  
+      <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.33" order="2"/>  
+      <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.25" order="2"/>  
+      <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.4" order="4"/>  
+      <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="sliding" type="sliding" visible="false" weight="0.4" order="0"/>  
+      <window_info id="Web" active="false" anchor="left" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.25" order="2"/>  
+      <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.33" order="0"/>  
+      <window_info id="EJB" active="false" anchor="bottom" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.25" order="3"/>  
+      <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.25" order="5"/> 
+    </layout> 
+  </component>  
+  <component name="ErrorTreeViewConfiguration"> 
+    <option name="IS_AUTOSCROLL_TO_SOURCE" value="false"/>  
+    <option name="HIDE_WARNINGS" value="false"/> 
+  </component>  
+  <component name="StructureViewFactory"> 
+    <option name="SORT_MODE" value="0"/>  
+    <option name="GROUP_INHERITED" value="true"/>  
+    <option name="AUTOSCROLL_MODE" value="true"/>  
+    <option name="SHOW_FIELDS" value="true"/>  
+    <option name="AUTOSCROLL_FROM_SOURCE" value="false"/>  
+    <option name="GROUP_GETTERS_AND_SETTERS" value="true"/>  
+    <option name="SHOW_INHERITED" value="false"/>  
+    <option name="HIDE_NOT_PUBLIC" value="false"/> 
+  </component>  
+  <component name="ProjectViewSettings"> 
+    <navigator currentView="ProjectPane" flattenPackages="false" showMembers="false" showStructure="false" autoscrollToSource="false" splitterProportion="0.5"/>  
+    <view id="ProjectPane"> 
+      <expanded_node type="directory" url="file://$PROJECT_DIR$"/> 
+    </view>  
+    <view id="SourcepathPane"/>  
+    <view id="ClasspathPane"/> 
+  </component>  
+  <component name="Commander"> 
+    <leftPanel view="Project"/>  
+    <rightPanel view="Project"/>  
+    <splitter proportion="0.5"/> 
+  </component>  
+  <component name="AspectsView"/>  
+  <component name="SelectInManager"/>  
+  <component name="HierarchyBrowserManager"> 
+    <option name="SHOW_PACKAGES" value="false"/>  
+    <option name="IS_AUTOSCROLL_TO_SOURCE" value="false"/>  
+    <option name="SORT_ALPHABETICALLY" value="false"/> 
+  </component>  
+  <component name="TodoView" selected-index="0"> 
+    <todo-panel id="selected-file"> 
+      <are-packages-shown value="false"/>  
+      <flatten-packages value="false"/>  
+      <is-autoscroll-to-source value="true"/> 
+    </todo-panel>  
+    <todo-panel id="all"> 
+      <are-packages-shown value="true"/>  
+      <flatten-packages value="false"/>  
+      <is-autoscroll-to-source value="true"/> 
+    </todo-panel> 
+  </component>  
+  <component name="editorManager"/>  
+  <component name="editorHistoryManager"/>  
+  <component name="DaemonCodeAnalyzer"> 
+    <disable_hints/> 
+  </component>  
+  <component name="InspectionManager"> 
+    <option name="AUTOSCROLL_TO_SOURCE" value="false"/>  
+    <option name="SPLITTER_PROPORTION" value="0.5"/>  
+    <profile name="Default"/> 
+  </component>  
+  <component name="BookmarkManager"/>  
+  <component name="DebuggerManager"> 
+    <line_breakpoints/>  
+    <exception_breakpoints> 
+      <breakpoint_any> 
+        <option name="NOTIFY_CAUGHT" value="true"/>  
+        <option name="NOTIFY_UNCAUGHT" value="true"/>  
+        <option name="ENABLED" value="false"/>  
+        <option name="SUSPEND_VM" value="true"/>  
+        <option name="COUNT_FILTER_ENABLED" value="false"/>  
+        <option name="COUNT_FILTER" value="0"/>  
+        <option name="CONDITION_ENABLED" value="false"/>  
+        <option name="CONDITION"/>  
+        <option name="LOG_ENABLED" value="false"/>  
+        <option name="LOG_EXPRESSION_ENABLED" value="false"/>  
+        <option name="LOG_MESSAGE"/>  
+        <option name="CLASS_FILTERS_ENABLED" value="false"/>  
+        <option name="INVERSE_CLASS_FILLTERS" value="false"/>  
+        <option name="SUSPEND_POLICY" value="SuspendAll"/> 
+      </breakpoint_any> 
+    </exception_breakpoints>  
+    <field_breakpoints/>  
+    <method_breakpoints/> 
+  </component>  
+  <component name="DebuggerSettings"> 
+    <option name="TRACING_FILTERS_ENABLED" value="true"/>  
+    <option name="TOSTRING_CLASSES_ENABLED" value="false"/>  
+    <option name="VALUE_LOOKUP_DELAY" value="700"/>  
+    <option name="DEBUGGER_TRANSPORT" value="0"/>  
+    <option name="FORCE_CLASSIC_VM" value="true"/>  
+    <option name="HIDE_DEBUGGER_ON_PROCESS_TERMINATION" value="false"/>  
+    <option name="SKIP_SYNTHETIC_METHODS" value="true"/>  
+    <option name="SKIP_CONSTRUCTORS" value="false"/>  
+    <option name="STEP_THREAD_SUSPEND_POLICY" value="SuspendThread"/>  
+    <default_breakpoint_settings> 
+      <option name="NOTIFY_CAUGHT" value="true"/>  
+      <option name="NOTIFY_UNCAUGHT" value="true"/>  
+      <option name="WATCH_MODIFICATION" value="true"/>  
+      <option name="WATCH_ACCESS" value="true"/>  
+      <option name="WATCH_ENTRY" value="true"/>  
+      <option name="WATCH_EXIT" value="true"/>  
+      <option name="ENABLED" value="true"/>  
+      <option name="SUSPEND_VM" value="true"/>  
+      <option name="COUNT_FILTER_ENABLED" value="false"/>  
+      <option name="COUNT_FILTER" value="0"/>  
+      <option name="CONDITION_ENABLED" value="false"/>  
+      <option name="CONDITION"/>  
+      <option name="LOG_ENABLED" value="false"/>  
+      <option name="LOG_EXPRESSION_ENABLED" value="false"/>  
+      <option name="LOG_MESSAGE"/>  
+      <option name="CLASS_FILTERS_ENABLED" value="false"/>  
+      <option name="INVERSE_CLASS_FILLTERS" value="false"/>  
+      <option name="SUSPEND_POLICY" value="SuspendAll"/> 
+    </default_breakpoint_settings>  
+    <filter> 
+      <option name="PATTERN" value="com.sun.*"/>  
+      <option name="ENABLED" value="true"/> 
+    </filter>  
+    <filter> 
+      <option name="PATTERN" value="java.*"/>  
+      <option name="ENABLED" value="true"/> 
+    </filter>  
+    <filter> 
+      <option name="PATTERN" value="javax.*"/>  
+      <option name="ENABLED" value="true"/> 
+    </filter>  
+    <filter> 
+      <option name="PATTERN" value="org.omg.*"/>  
+      <option name="ENABLED" value="true"/> 
+    </filter>  
+    <filter> 
+      <option name="PATTERN" value="sun.*"/>  
+      <option name="ENABLED" value="true"/> 
+    </filter>  
+    <filter> 
+      <option name="PATTERN" value="junit.*"/>  
+      <option name="ENABLED" value="true"/> 
+    </filter> 
+  </component>  
+  <component name="CompilerWorkspaceConfiguration"> 
+    <option name="COMPILE_IN_BACKGROUND" value="false"/>  
+    <option name="AUTO_SHOW_ERRORS_IN_EDITOR" value="true"/> 
+  </component>  
+  <component name="RunManager"> 
+    <activeType name="Application"/>  
+    <configuration selected="false" default="true" type="Applet" factoryName="Applet"> 
+      <module name=""/>  
+      <option name="MAIN_CLASS_NAME"/>  
+      <option name="HTML_FILE_NAME"/>  
+      <option name="HTML_USED" value="false"/>  
+      <option name="WIDTH" value="400"/>  
+      <option name="HEIGHT" value="300"/>  
+      <option name="POLICY_FILE" value="$APPLICATION_HOME_DIR$/bin/appletviewer.policy"/>  
+      <option name="VM_PARAMETERS"/> 
+    </configuration>  
+    <configuration selected="false" default="true" type="Remote" factoryName="Remote"> 
+      <option name="USE_SOCKET_TRANSPORT" value="true"/>  
+      <option name="SERVER_MODE" value="false"/>  
+      <option name="SHMEM_ADDRESS" value="javadebug"/>  
+      <option name="HOST" value="localhost"/>  
+      <option name="PORT" value="5005"/> 
+    </configuration>  
+    <configuration selected="false" default="true" type="Application" factoryName="Application"> 
+      <option name="MAIN_CLASS_NAME"/>  
+      <option name="VM_PARAMETERS"/>  
+      <option name="PROGRAM_PARAMETERS"/>  
+      <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$"/>  
+      <module name=""/> 
+    </configuration>  
+    <configuration selected="false" default="true" type="JUnit" factoryName="JUnit"> 
+      <module name=""/>  
+      <option name="PACKAGE_NAME"/>  
+      <option name="MAIN_CLASS_NAME"/>  
+      <option name="METHOD_NAME"/>  
+      <option name="TEST_OBJECT" value="class"/>  
+      <option name="VM_PARAMETERS"/>  
+      <option name="PARAMETERS"/>  
+      <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$"/>  
+      <option name="ADDITIONAL_CLASS_PATH"/>  
+      <option name="TEST_SEARCH_SCOPE"> 
+        <value defaultName="wholeProject"/> 
+      </option> 
+    </configuration> 
+  </component>  
+  <component name="VcsManagerConfiguration"> 
+    <option name="ACTIVE_VCS_NAME" value="git"/>  
+    <option name="STATE" value="0"/> 
+  </component>  
+  <component name="VssConfiguration"> 
+    <CheckoutOptions> 
+      <option name="COMMENT" value=""/>  
+      <option name="DO_NOT_GET_LATEST_VERSION" value="false"/>  
+      <option name="REPLACE_WRITABLE" value="false"/>  
+      <option name="RECURSIVE" value="false"/> 
+    </CheckoutOptions>  
+    <CheckinOptions> 
+      <option name="COMMENT" value=""/>  
+      <option name="KEEP_CHECKED_OUT" value="false"/>  
+      <option name="RECURSIVE" value="false"/> 
+    </CheckinOptions>  
+    <AddOptions> 
+      <option name="COMMENT" value=""/>  
+      <option name="STORE_ONLY_LATEST_VERSION" value="false"/>  
+      <option name="CHECK_OUT_IMMEDIATELY" value="false"/>  
+      <option name="FILE_TYPE" value="0"/> 
+    </AddOptions>  
+    <UndocheckoutOptions> 
+      <option name="MAKE_WRITABLE" value="false"/>  
+      <option name="REPLACE_LOCAL_COPY" value="0"/>  
+      <option name="RECURSIVE" value="false"/> 
+    </UndocheckoutOptions>  
+    <DiffOptions> 
+      <option name="IGNORE_WHITE_SPACE" value="false"/>  
+      <option name="IGNORE_CASE" value="false"/> 
+    </DiffOptions>  
+    <GetOptions> 
+      <option name="REPLACE_WRITABLE" value="0"/>  
+      <option name="MAKE_WRITABLE" value="false"/>  
+      <option name="RECURSIVE" value="false"/> 
+    </GetOptions>  
+    <option name="CLIENT_PATH" value=""/>  
+    <option name="SRCSAFEINI_PATH" value=""/>  
+    <option name="USER_NAME" value=""/>  
+    <option name="PWD" value=""/>  
+    <option name="SHOW_CHECKOUT_OPTIONS" value="true"/>  
+    <option name="SHOW_ADD_OPTIONS" value="true"/>  
+    <option name="SHOW_UNDOCHECKOUT_OPTIONS" value="true"/>  
+    <option name="SHOW_DIFF_OPTIONS" value="true"/>  
+    <option name="SHOW_GET_OPTIONS" value="true"/>  
+    <option name="USE_EXTERNAL_DIFF" value="false"/>  
+    <option name="EXTERNAL_DIFF_PATH" value=""/>  
+    <option name="REUSE_LAST_COMMENT" value="false"/>  
+    <option name="PUT_FOCUS_INTO_COMMENT" value="false"/>  
+    <option name="SHOW_CHECKIN_OPTIONS" value="true"/>  
+    <option name="LAST_COMMIT_MESSAGE" value=""/>  
+    <option name="CHECKIN_DIALOG_SPLITTER_PROPORTION" value="0.8"/> 
+  </component>  
+  <component name="CheckinPanelState"/>  
+  <component name="WebViewSettings"> 
+    <webview flattenPackages="false" showMembers="false" autoscrollToSource="false"/> 
+  </component>  
+  <component name="EjbViewSettings"> 
+    <EjbView showMembers="false" autoscrollToSource="false"/> 
+  </component>  
+  <component name="AppServerRunManager"/>  
+  <component name="StarteamConfiguration"> 
+    <option name="SERVER" value=""/>  
+    <option name="PORT" value="49201"/>  
+    <option name="USER" value=""/>  
+    <option name="PASSWORD" value=""/>  
+    <option name="PROJECT" value=""/>  
+    <option name="VIEW" value=""/>  
+    <option name="ALTERNATIVE_WORKING_PATH" value=""/>  
+    <option name="PUT_FOCUS_INTO_COMMENT" value="false"/>  
+    <option name="SHOW_CHECKIN_OPTIONS" value="true"/>  
+    <option name="LAST_COMMIT_MESSAGE" value=""/>  
+    <option name="CHECKIN_DIALOG_SPLITTER_PROPORTION" value="0.8"/> 
+  </component>  
+  <component name="Cvs2Configuration"> 
+    <option name="ON_FILE_ADDING" value="0"/>  
+    <option name="ON_FILE_REMOVING" value="0"/>  
+    <option name="PRUNE_EMPTY_DIRECTORIES" value="true"/>  
+    <option name="SHOW_UPDATE_OPTIONS" value="true"/>  
+    <option name="SHOW_ADD_OPTIONS" value="true"/>  
+    <option name="SHOW_REMOVE_OPTIONS" value="true"/>  
+    <option name="MERGING_MODE" value="0"/>  
+    <option name="MERGE_WITH_BRANCH1_NAME" value="HEAD"/>  
+    <option name="MERGE_WITH_BRANCH2_NAME" value="HEAD"/>  
+    <option name="RESET_STICKY" value="false"/>  
+    <option name="CREATE_NEW_DIRECTORIES" value="true"/>  
+    <option name="DEFAULT_TEXT_FILE_SUBSTITUTION" value="kv"/>  
+    <option name="PROCESS_UNKNOWN_FILES" value="false"/>  
+    <option name="PROCESS_DELETED_FILES" value="false"/>  
+    <option name="SHOW_EDIT_DIALOG" value="true"/>  
+    <option name="RESERVED_EDIT" value="false"/>  
+    <option name="FILE_HISTORY_SPLITTER_PROPORTION" value="0.6"/>  
+    <option name="SHOW_CHECKOUT_OPTIONS" value="true"/>  
+    <option name="CHECKOUT_DATE_OR_REVISION_SETTINGS"> 
+      <value> 
+        <option name="BRANCH" value=""/>  
+        <option name="DATE" value=""/>  
+        <option name="USE_BRANCH" value="false"/>  
+        <option name="USE_DATE" value="false"/> 
+      </value> 
+    </option>  
+    <option name="UPDATE_DATE_OR_REVISION_SETTINGS"> 
+      <value> 
+        <option name="BRANCH" value=""/>  
+        <option name="DATE" value=""/>  
+        <option name="USE_BRANCH" value="false"/>  
+        <option name="USE_DATE" value="false"/> 
+      </value> 
+    </option>  
+    <option name="SHOW_CHANGES_REVISION_SETTINGS"> 
+      <value> 
+        <option name="BRANCH" value=""/>  
+        <option name="DATE" value=""/>  
+        <option name="USE_BRANCH" value="false"/>  
+        <option name="USE_DATE" value="false"/> 
+      </value> 
+    </option>  
+    <option name="SHOW_OUTPUT" value="false"/>  
+    <option name="SHOW_FILE_HISTORY_AS_TREE" value="false"/>  
+    <option name="UPDATE_GROUP_BY_PACKAGES" value="false"/>  
+    <option name="ADD_WATCH_INDEX" value="0"/>  
+    <option name="REMOVE_WATCH_INDEX" value="0"/>  
+    <option name="UPDATE_KEYWORD_SUBSTITUTION"/>  
+    <option name="MAKE_NEW_FILES_READONLY" value="false"/>  
+    <option name="SHOW_CORRUPTED_PROJECT_FILES" value="0"/>  
+    <option name="TAG_AFTER_FILE_COMMIT" value="false"/>  
+    <option name="TAG_AFTER_FILE_COMMIT_NAME" value=""/>  
+    <option name="TAG_AFTER_PROJECT_COMMIT" value="false"/>  
+    <option name="TAG_AFTER_PROJECT_COMMIT_NAME" value=""/>  
+    <option name="PUT_FOCUS_INTO_COMMENT" value="false"/>  
+    <option name="SHOW_CHECKIN_OPTIONS" value="true"/>  
+    <option name="FORCE_NON_EMPTY_COMMENT" value="false"/>  
+    <option name="LAST_COMMIT_MESSAGE" value=""/>  
+    <option name="SAVE_LAST_COMMIT_MESSAGE" value="true"/>  
+    <option name="CHECKIN_DIALOG_SPLITTER_PROPORTION" value="0.8"/>  
+    <option name="OPTIMIZE_IMPORTS_BEFORE_PROJECT_COMMIT" value="false"/>  
+    <option name="OPTIMIZE_IMPORTS_BEFORE_FILE_COMMIT" value="false"/>  
+    <option name="REFORMAT_BEFORE_PROJECT_COMMIT" value="false"/>  
+    <option name="REFORMAT_BEFORE_FILE_COMMIT" value="false"/>  
+    <option name="FILE_HISTORY_DIALOG_COMMENTS_SPLITTER_PROPORTION" value="0.8"/>  
+    <option name="FILE_HISTORY_DIALOG_SPLITTER_PROPORTION" value="0.5"/> 
+  </component>  
+  <component name="CvsTabbedWindow"/>  
+  <component name="SvnConfiguration"> 
+    <option name="USER" value=""/>  
+    <option name="PASSWORD" value=""/>  
+    <option name="AUTO_ADD_FILES" value="0"/>  
+    <option name="AUTO_DEL_FILES" value="0"/> 
+  </component>  
+  <component name="PerforceConfiguration"> 
+    <option name="PORT" value="magic:1666"/>  
+    <option name="USER" value=""/>  
+    <option name="PASSWORD" value=""/>  
+    <option name="CLIENT" value=""/>  
+    <option name="TRACE" value="false"/>  
+    <option name="PERFORCE_STATUS" value="true"/>  
+    <option name="CHANGELIST_OPTION" value="false"/>  
+    <option name="SYSTEMROOT" value=""/>  
+    <option name="P4_EXECUTABLE" value="p4"/>  
+    <option name="SHOW_BRANCH_HISTORY" value="false"/>  
+    <option name="GENERATE_COMMENT" value="false"/>  
+    <option name="SYNC_OPTION" value="Sync"/>  
+    <option name="PUT_FOCUS_INTO_COMMENT" value="false"/>  
+    <option name="SHOW_CHECKIN_OPTIONS" value="true"/>  
+    <option name="FORCE_NON_EMPTY_COMMENT" value="true"/>  
+    <option name="LAST_COMMIT_MESSAGE" value=""/>  
+    <option name="SAVE_LAST_COMMIT_MESSAGE" value="true"/>  
+    <option name="CHECKIN_DIALOG_SPLITTER_PROPORTION" value="0.8"/>  
+    <option name="OPTIMIZE_IMPORTS_BEFORE_PROJECT_COMMIT" value="false"/>  
+    <option name="OPTIMIZE_IMPORTS_BEFORE_FILE_COMMIT" value="false"/>  
+    <option name="REFORMAT_BEFORE_PROJECT_COMMIT" value="false"/>  
+    <option name="REFORMAT_BEFORE_FILE_COMMIT" value="false"/>  
+    <option name="FILE_HISTORY_DIALOG_COMMENTS_SPLITTER_PROPORTION" value="0.8"/>  
+    <option name="FILE_HISTORY_DIALOG_SPLITTER_PROPORTION" value="0.5"/> 
+  </component> 
+</project>
diff --git a/metadata-service/data-builders/data-builders.iml b/metadata-service/data-builders/data-builders.iml
new file mode 100644
index 0000000..3d5413d
--- /dev/null
+++ b/metadata-service/data-builders/data-builders.iml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_11">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/target/maven-shared-archive-resources" isTestSource="false" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/metadata-service/data-builders/pom.xml b/metadata-service/data-builders/pom.xml
new file mode 100644
index 0000000..1af2131
--- /dev/null
+++ b/metadata-service/data-builders/pom.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>airavata-data-lake</artifactId>
+        <groupId>org.apache.airavata.data.lake</groupId>
+        <version>0.01-SNAPSHOT</version>
+        <relativePath>../../pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>data-builders</artifactId>
+
+    <properties>
+        <maven.compiler.source>11</maven.compiler.source>
+        <maven.compiler.target>11</maven.compiler.target>
+    </properties>
+
+</project>
\ No newline at end of file
diff --git a/metadata-service/db-service/db-service.iml b/metadata-service/db-service/db-service.iml
new file mode 100644
index 0000000..a137c71
--- /dev/null
+++ b/metadata-service/db-service/db-service.iml
@@ -0,0 +1,420 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="web" name="Web">
+      <configuration>
+        <webroots />
+        <sourceRoots>
+          <root url="file://$MODULE_DIR$/src/main/java" />
+          <root url="file://$MODULE_DIR$/src/main/resources" />
+        </sourceRoots>
+      </configuration>
+    </facet>
+    <facet type="Spring" name="Spring">
+      <configuration />
+    </facet>
+  </component>
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_11">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/target/maven-shared-archive-resources" isTestSource="true" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/org/neo4j/neo4j-ogm-bolt-driver/3.2.20/neo4j-ogm-bolt-driver-3.2.20.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/org/neo4j/neo4j-ogm-api/3.2.20/neo4j-ogm-api-3.2.20.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/com/fasterxml/jackson/core/jackson-databind/2.9.9/jackson-databind-2.9.9.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/com/fasterxml/jackson/core/jackson-annotations/2.9.0/jackson-annotations-2.9.0.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/com/fasterxml/jackson/core/jackson-core/2.9.9/jackson-core-2.9.9.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.9.9/jackson-datatype-jdk8-2.9.9.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.9.9/jackson-datatype-jsr310-2.9.9.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/org/neo4j/driver/neo4j-java-driver/4.0.2/neo4j-java-driver-4.0.2.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/org/neo4j/neo4j-ogm-core/3.2.20/neo4j-ogm-core-3.2.20.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/org/apache/commons/commons-lang3/3.8/commons-lang3-3.8.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/io/github/classgraph/classgraph/4.8.86/classgraph-4.8.86.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/org/springframework/boot/spring-boot-starter-web/2.4.2/spring-boot-starter-web-2.4.2.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/org/springframework/boot/spring-boot-starter/2.4.2/spring-boot-starter-2.4.2.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/org/springframework/boot/spring-boot/2.4.2/spring-boot-2.4.2.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/org/springframework/spring-core/5.3.3/spring-core-5.3.3.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/org/springframework/spring-jcl/5.3.3/spring-jcl-5.3.3.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/org/springframework/spring-context/5.3.3/spring-context-5.3.3.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/org/springframework/spring-aop/5.3.3/spring-aop-5.3.3.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/org/springframework/spring-beans/5.3.3/spring-beans-5.3.3.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/org/springframework/spring-expression/5.3.3/spring-expression-5.3.3.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/org/springframework/boot/spring-boot-autoconfigure/2.4.2/spring-boot-autoconfigure-2.4.2.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/org/springframework/boot/spring-boot-starter-logging/2.4.2/spring-boot-starter-logging-2.4.2.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/org/apache/logging/log4j/log4j-to-slf4j/2.13.3/log4j-to-slf4j-2.13.3.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/org/apache/logging/log4j/log4j-api/2.13.3/log4j-api-2.13.3.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/org/slf4j/jul-to-slf4j/1.7.30/jul-to-slf4j-1.7.30.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/org/yaml/snakeyaml/1.27/snakeyaml-1.27.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/org/springframework/boot/spring-boot-starter-json/2.4.2/spring-boot-starter-json-2.4.2.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/org/springframework/spring-web/5.3.3/spring-web-5.3.3.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/com/fasterxml/jackson/module/jackson-module-parameter-names/2.11.4/jackson-module-parameter-names-2.11.4.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/org/springframework/boot/spring-boot-starter-tomcat/2.4.2/spring-boot-starter-tomcat-2.4.2.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/org/apache/tomcat/embed/tomcat-embed-core/9.0.41/tomcat-embed-core-9.0.41.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/org/glassfish/jakarta.el/3.0.3/jakarta.el-3.0.3.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/org/apache/tomcat/embed/tomcat-embed-websocket/9.0.41/tomcat-embed-websocket-9.0.41.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$USER_HOME$/.m12/org/springframework/spring-webmvc/5.3.3/spring-webmvc-5.3.3.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.4.2" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.4.2" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.4.2" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.4.2" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.4.2" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.13.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.13.3" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.30" level="project" />
+    <orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-core:5.3.3" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.3.3" level="project" />
+    <orderEntry type="library" name="Maven: org.yaml:snakeyaml:1.27" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.4.2" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.11.4" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.11.4" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.11.4" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.11.4" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.11.4" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.11.4" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.4.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.41" level="project" />
+    <orderEntry type="library" name="Maven: org.glassfish:jakarta.el:3.0.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.41" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-web:5.3.3" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.3.3" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.3.3" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.3.3" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context:5.3.3" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.3.3" level="project" />
+    <orderEntry type="library" name="Maven: org.neo4j:neo4j-ogm-core:3.2.20" level="project" />
+    <orderEntry type="library" name="Maven: org.neo4j:neo4j-ogm-api:3.2.20" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.25" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.8" level="project" />
+    <orderEntry type="library" name="Maven: io.github.classgraph:classgraph:4.8.86" level="project" />
+    <orderEntry type="library" name="Maven: org.neo4j:neo4j-ogm-bolt-driver:3.2.20" level="project" />
+    <orderEntry type="library" name="Maven: org.neo4j.driver:neo4j-java-driver:4.0.2" level="project" />
+    <orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.3" level="project" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/metadata-service/db-service/pom.xml b/metadata-service/db-service/pom.xml
new file mode 100644
index 0000000..594f50f
--- /dev/null
+++ b/metadata-service/db-service/pom.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>metadata-service</artifactId>
+        <groupId>org.apache.airavata.data.lake</groupId>
+        <version>0.01-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>db-service</artifactId>
+
+    <properties>
+        <maven.compiler.source>11</maven.compiler.source>
+        <maven.compiler.target>11</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+<!--        <dependency>-->
+<!--            <groupId>org.springframework.data</groupId>-->
+<!--            <artifactId>spring-data-neo4j</artifactId>-->
+<!--        </dependency>-->
+        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-neo4j -->
+<!--        <dependency>-->
+<!--            <groupId>org.springframework.boot</groupId>-->
+<!--            <artifactId>spring-boot-starter-data-neo4j</artifactId>-->
+<!--        </dependency>-->
+
+        <dependency>
+            <groupId>org.neo4j</groupId>
+            <artifactId>neo4j-ogm-core</artifactId>
+        </dependency>
+
+        <!-- Only add if you're using the Bolt driver -->
+        <dependency>
+            <groupId>org.neo4j</groupId>
+            <artifactId>neo4j-ogm-bolt-driver</artifactId>
+        </dependency>
+
+    </dependencies>
+
+
+</project>
\ No newline at end of file
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/AppConfig.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/AppConfig.java
new file mode 100644
index 0000000..d941b92
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/AppConfig.java
@@ -0,0 +1,108 @@
+package org.apache.airavata.datalake.metadata.db.service;
+
+import org.apache.airavata.datalake.metadata.db.service.backend.Connector;
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.Neo4JConnector;
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.nodes.Group;
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.nodes.Resource;
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.nodes.Tenant;
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.nodes.User;
+import org.neo4j.ogm.cypher.ComparisonOperator;
+import org.neo4j.ogm.cypher.Filter;
+import org.neo4j.ogm.session.Session;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+
+@Configuration
+public class AppConfig {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(AppConfig.class);
+
+    @Autowired
+    private Connector connector;
+
+
+    @Bean
+    Tenant getTenant() {
+        LOGGER.info("Calling get tenant############");
+        Tenant tenant = new Tenant();
+        tenant.setTenantId("123456789");
+        tenant.setName("Tenant");
+
+        User user = new User();
+        user.setFirstName("UserA");
+        user.setUserName("user_a");
+
+        User user1 = new User();
+        user1.setFirstName("UserB");
+        user1.setUserName("user_b");
+
+        User user2 = new User();
+        user2.setFirstName("UserC");
+        user2.setUserName("user_c");
+
+        Group group = new Group();
+        group.setName("g1");
+
+        Group group2 = new Group();
+        group2.setName("g2");
+
+        Group group3 = new Group();
+        group3.setName("g3");
+
+        group.addChildGroup(group2, 0, 0, null);
+        group2.addChildGroup(group3, 0, 0, null);
+
+
+        Resource resource = new Resource();
+        resource.setName("R1");
+
+        Resource resource1 = new Resource();
+        resource1.setName("R2");
+
+        Resource resource2 = new Resource();
+        resource2.setName("R3");
+
+        Resource resource3 = new Resource();
+        resource3.setName("R4");
+
+
+        group.addChildUser(user, "ADMIN", 0, 0, null);
+        resource.addChildResource(resource1, 0, 0, null);
+        resource.shareWithAUser(user, "READ", 0, 0, null);
+
+
+        group2.addChildUser(user1, "ADMIN", 0, 0, null);
+        group3.addChildUser(user2, "ADMIN", 0, 0, null);
+
+        resource1.shareWithAGroup(group2, "WRITE", 0, 0, null);
+        resource2.shareWithAGroup(group3, "WRITE", 0, 0, null);
+
+        tenant.add(user, 0, 0, null);
+        tenant.add(group, 0, 0, null);
+        tenant.add(resource, 0, 0, null);
+
+        Session session = ((Neo4JConnector) connector).openConnection();
+        session.save(tenant);
+
+        Filter filter = new Filter("name", ComparisonOperator.EQUALS, "R3");
+
+//        Collection<Resource> resources = session.loadAll(Resource.class, filter, 1);
+//        resources.stream().forEach(t -> {
+//            LOGGER.info("Resources " + t.getName());
+//            t.addChildResource(resource3, 0, 0, null);
+//            Resource resource4 = (Resource) session.load(Resource.class, new Long(13));
+//            session.delete(resource4);
+//            session.save(t);
+//        });
+
+
+        return tenant;
+
+    }
+
+
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/Neo4JServiceInitializer.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/Neo4JServiceInitializer.java
new file mode 100644
index 0000000..9a3d9c8
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/Neo4JServiceInitializer.java
@@ -0,0 +1,14 @@
+package org.apache.airavata.datalake.metadata.db.service;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+
+@ComponentScan(basePackages = {"org.apache.airavata"})
+@SpringBootApplication
+public class Neo4JServiceInitializer {
+
+    public static void main(String[] args) {
+        SpringApplication.run(Neo4JServiceInitializer.class, args);
+    }
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/XmlConfiguration.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/XmlConfiguration.java
new file mode 100644
index 0000000..bd8e468
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/XmlConfiguration.java
@@ -0,0 +1,9 @@
+package org.apache.airavata.datalake.metadata.db.service;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.ImportResource;
+
+@Configuration
+@ImportResource({"classpath*:applicationContext.xml"})
+public class XmlConfiguration {
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/Connector.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/Connector.java
new file mode 100644
index 0000000..c96905f
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/Connector.java
@@ -0,0 +1,10 @@
+package org.apache.airavata.datalake.metadata.db.service.backend;
+
+import java.io.Closeable;
+
+public interface Connector extends Closeable {
+
+    public boolean init();
+
+
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/Person.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/Person.java
new file mode 100644
index 0000000..83988ac
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/Person.java
@@ -0,0 +1,74 @@
+package org.apache.airavata.datalake.metadata.db.service.backend;
+
+
+import org.neo4j.ogm.annotation.Properties;
+import org.neo4j.ogm.annotation.*;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@NodeEntity
+public class Person {
+
+
+    @Id
+    @GeneratedValue
+//    //Add this annotation
+//    @org.springframework.data.annotation.Id
+//    @Property
+    private Long id;
+
+    @Property
+    private String name;
+
+    @Properties(allowCast = true)
+    private Map<String, Object> valueProperties = new HashMap<>();
+
+    private Person() {
+        // Empty constructor required as of Neo4j API 2.0.5
+    }
+
+    ;
+
+    public Person(String name) {
+        this.name = name;
+    }
+
+
+    /**
+     * Neo4j doesn't REALLY have bi-directional relationships. It just means when querying
+     * to ignore the direction of the relationship.
+     * https://dzone.com/articles/modelling-data-neo4j
+     */
+    @Relationship(type = "TEAMMATE")
+    public Set<Person> teammates;
+
+    public void worksWith(Person person) {
+        if (teammates == null) {
+            teammates = new HashSet<>();
+        }
+        teammates.add(person);
+    }
+
+
+    public void addProperty(String key, String value) {
+        this.valueProperties.put(key, value);
+    }
+
+    public String toString() {
+
+        return this.name + "'s teammates => "
+                + Optional.ofNullable(this.teammates).orElse(
+                Collections.emptySet()).stream()
+                .map(Person::getName)
+                .collect(Collectors.toList());
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}
\ No newline at end of file
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/Neo4JConnector.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/Neo4JConnector.java
new file mode 100644
index 0000000..befa1cd
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/Neo4JConnector.java
@@ -0,0 +1,53 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j;
+
+import org.apache.airavata.datalake.metadata.db.service.backend.Connector;
+import org.apache.airavata.datalake.metadata.db.service.exceptions.DBConnectorException;
+import org.neo4j.ogm.config.Configuration;
+import org.neo4j.ogm.session.Session;
+import org.neo4j.ogm.session.SessionFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+
+import java.io.IOException;
+
+public class Neo4JConnector implements Connector {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(Neo4JConnector.class);
+
+    private SessionFactory factory;
+
+    @Value("${spring.neo4j.uri}")
+    private String neo4JURI;
+
+
+    @Override
+    public boolean init() {
+        try {
+            LOGGER.info("Initializing Neo4J connector ......");
+            Configuration configuration = new Configuration.Builder()
+                    .uri(neo4JURI)
+                    .build();
+            factory =
+                    new SessionFactory(configuration, "org.apache.airavata.datalake.metadata.db.service");
+            return true;
+        } catch (Exception ex) {
+            String msg = "Neo4J Connection Failure, " + ex.getMessage();
+            LOGGER.error(msg);
+            throw new DBConnectorException(msg, ex);
+        }
+    }
+
+    @Override
+    public void close() throws IOException {
+        if (factory != null) {
+            factory.close();
+        }
+    }
+
+    public Session openConnection() {
+        return factory.openSession();
+    }
+
+
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/GenericService.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/GenericService.java
new file mode 100644
index 0000000..1a24815
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/GenericService.java
@@ -0,0 +1,79 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.curd.operators;
+
+import org.apache.airavata.datalake.metadata.db.service.backend.Connector;
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.Neo4JConnector;
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.nodes.Entity;
+import org.neo4j.ogm.cypher.Filter;
+import org.neo4j.ogm.cypher.query.Pagination;
+import org.neo4j.ogm.cypher.query.SortOrder;
+import org.neo4j.ogm.session.Session;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicReference;
+
+public abstract class GenericService<T> implements Service<T> {
+
+    private static final int DEPTH_LIST = 0;
+    private static final int DEPTH_ENTITY = 1;
+
+    private Connector connector;
+
+    private Session session;
+
+    public GenericService(@Autowired Connector connector) {
+        this.connector = connector;
+        this.session = ((Neo4JConnector) this.connector).openConnection();
+    }
+
+
+    @Override
+    public Iterable<T> findAll() {
+        return session.loadAll(getEntityType(), DEPTH_LIST);
+    }
+
+    @Override
+    public T find(Long id) {
+        return session.load(getEntityType(), id, DEPTH_ENTITY);
+    }
+
+    @Override
+    public void delete(Long id) {
+        session.delete(session.load(getEntityType(), id));
+    }
+
+    @Override
+    public Collection<T> search(List<SearchOperator> searchOperatorList) {
+        AtomicReference<Filter> filter = null;
+        searchOperatorList.forEach(value -> {
+            if (filter.get() == null) {
+                filter.set(new Filter(value.getValue(), value.getComparisonOperator(), value.getValue()));
+            } else {
+                filter.get().and(new Filter(value.getValue(), value.getComparisonOperator(), value.getValue()));
+            }
+
+        });
+        return session.loadAll(getEntityType(), filter.get());
+    }
+
+    @Override
+    public Iterable<T> sort(SortOrder.Direction sortOrder, String property) {
+       return  session.loadAll(getEntityType(),new SortOrder().add(sortOrder,property));
+    }
+
+    @Override
+    public Iterable<T> sortAndPaging(SortOrder.Direction sortOrder, int pageNumber,
+                                     int itemsPerPage, String property) {
+        return  session.loadAll(getEntityType(),
+                new SortOrder().add(sortOrder,property), new Pagination(pageNumber,itemsPerPage));
+    }
+
+    @Override
+    public T createOrUpdate(T entity) {
+        session.save(entity, DEPTH_ENTITY);
+        return find(((Entity) entity).getId());
+    }
+
+    abstract Class<T> getEntityType();
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/GroupService.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/GroupService.java
new file mode 100644
index 0000000..dc83a02
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/GroupService.java
@@ -0,0 +1,4 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.curd.operators;
+
+public interface GroupService {
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/ResourceService.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/ResourceService.java
new file mode 100644
index 0000000..5cf5a03
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/ResourceService.java
@@ -0,0 +1,4 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.curd.operators;
+
+public interface ResourceService {
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/SearchOperator.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/SearchOperator.java
new file mode 100644
index 0000000..1717d1a
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/SearchOperator.java
@@ -0,0 +1,33 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.curd.operators;
+
+import org.neo4j.ogm.cypher.ComparisonOperator;
+
+public class SearchOperator {
+    private String key;
+    private String value;
+    private ComparisonOperator comparisonOperator;
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public ComparisonOperator getComparisonOperator() {
+        return comparisonOperator;
+    }
+
+    public void setComparisonOperator(ComparisonOperator comparisonOperator) {
+        this.comparisonOperator = comparisonOperator;
+    }
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/Service.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/Service.java
new file mode 100644
index 0000000..ee73d18
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/Service.java
@@ -0,0 +1,24 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.curd.operators;
+
+import org.neo4j.ogm.cypher.query.SortOrder;
+
+import java.util.Collection;
+import java.util.List;
+
+public interface Service<T> {
+
+    Iterable<T> findAll();
+
+    T find(Long id);
+
+    void delete(Long id);
+
+    Collection<T> search(List<SearchOperator> searchOperatorList);
+
+    Iterable<T> sort(SortOrder.Direction sortOrder, String property);
+
+    Iterable<T> sortAndPaging(SortOrder.Direction direction, int pageNumber, int itemsPerPage, String property);
+
+    T createOrUpdate(T Object);
+
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/UserService.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/UserService.java
new file mode 100644
index 0000000..7669a05
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/UserService.java
@@ -0,0 +1,4 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.curd.operators;
+
+public interface UserService {
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/Entity.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/Entity.java
new file mode 100644
index 0000000..158f94a
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/Entity.java
@@ -0,0 +1,109 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.nodes;
+
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships.Has;
+import org.neo4j.ogm.annotation.*;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public abstract class Entity {
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    @Properties(prefix = "external_id")
+    private Map<String,String > externalIds = new HashMap<>();
+
+    @Property(name = "created_at")
+    private long createdAt = System.currentTimeMillis();
+
+    @Property(name = "last_modified_at")
+    private long lastModifiedAt = System.currentTimeMillis();
+
+    @Property(name = "source")
+    private String source;
+
+    @Properties(prefix = "custom")
+    private Map<String, String> properties = new HashMap<>();
+
+    @Property(name = "primary_external_key")
+    private String primaryExternalKey;
+
+    @Relationship(type = "HAS", direction = Relationship.INCOMING)
+    private Has tenantInPointer;
+
+    @Property(name = "tenant_id")
+    private String tenantId;
+
+    public Long getId() {
+        return id;
+    }
+
+    public long getCreatedAt() {
+        return createdAt;
+    }
+
+    public void setCreatedAt(long createdAt) {
+        this.createdAt = createdAt;
+    }
+
+    public long getLastModifiedAt() {
+        return lastModifiedAt;
+    }
+
+    public void setLastModifiedAt(long lastModifiedAt) {
+        this.lastModifiedAt = lastModifiedAt;
+    }
+
+    public Map<String, String> getProperties() {
+        return properties;
+    }
+
+    public void setProperties(Map<String, String> properties) {
+        this.properties = properties;
+    }
+
+    public Map<String, String> getExternalIds() {
+        return externalIds;
+    }
+
+    public void setExternalIds(Map<String, String> externalIds) {
+        this.externalIds = externalIds;
+    }
+
+    public String getSource() {
+        return source;
+    }
+
+    public void setSource(String source) {
+        this.source = source;
+    }
+
+    public String getPrimaryExternalKey() {
+        return primaryExternalKey;
+    }
+
+    public void setPrimaryExternalKey(String primaryExternalKey) {
+        this.primaryExternalKey = primaryExternalKey;
+    }
+
+    public Has getTenantInPointer() {
+        return tenantInPointer;
+    }
+
+    public void setTenantInPointer(Has tenantInPointer) {
+        this.tenantInPointer = tenantInPointer;
+    }
+
+    public String getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(String tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/Group.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/Group.java
new file mode 100644
index 0000000..3d26d98
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/Group.java
@@ -0,0 +1,208 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.nodes;
+
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships.*;
+import org.neo4j.ogm.annotation.NodeEntity;
+import org.neo4j.ogm.annotation.Property;
+import org.neo4j.ogm.annotation.Relationship;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+@NodeEntity
+public class Group extends Entity {
+
+    @Property(name = "name")
+    private String name;
+
+    @Property(name = "description")
+    private String description;
+
+
+    @Relationship(type = "HAS_CHILD_GROUP")
+    private Set<HasChildGroup> childGroups = new HashSet<>();
+
+    @Relationship(type = "HAS_CHILD_GROUP", direction = Relationship.INCOMING)
+    private HasChildGroup ChildGroupInPointers;
+
+    @Relationship(type = "HAS_CHILD_USER")
+    private Set<HasChildUser> childUsers = new HashSet<>();
+
+    @Relationship(type = "HAS_PARENT_GROUP", direction = Relationship.INCOMING)
+    private Set<HasParentGroup> parentGroupInPointers = new HashSet<>();
+
+    @Relationship(type = "HAS_PARENT_GROUP")
+    private HasParentGroup parent;
+
+    @Relationship(type = "MEMBER_OF", direction = Relationship.INCOMING)
+    private Set<MemberOf> memberUsersInPointers = new HashSet<>();
+
+    @Relationship(type = "SHARED_WITH", direction = Relationship.INCOMING)
+    private Set<SharedWith> sharedResourcesInPointers = new HashSet<>();
+
+    @Relationship(type = "HAS_ACCESS")
+    private Set<HasAccess> accessibleResources = new HashSet<>();
+
+
+    public Group() {
+
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+
+    public Set<HasChildGroup> getChildGroups() {
+        return childGroups;
+    }
+
+    public void addChildGroup(HasChildGroup childGroup) {
+        this.childGroups.add(childGroup);
+    }
+
+    public Set<HasChildUser> getChildUsers() {
+        return childUsers;
+    }
+
+    public void addChildUser(HasChildUser childUser) {
+        this.childUsers.add(childUser);
+    }
+
+
+    public Set<MemberOf> getMemberUsersInPointers() {
+        return memberUsersInPointers;
+    }
+
+    private void addMemberUserInPointer(MemberOf memberUser) {
+        this.memberUsersInPointers.add(memberUser);
+    }
+
+    public Set<SharedWith> getSharedResourcesInPointers() {
+        return sharedResourcesInPointers;
+    }
+
+    public void addSharedResourcesInPointers(SharedWith sharedResourcesInPointer) {
+        this.sharedResourcesInPointers.add(sharedResourcesInPointer);
+    }
+
+    public Set<HasAccess> getAccessibleResources() {
+        return accessibleResources;
+    }
+
+    public void addAccessibleResources(HasAccess accessibleResources) {
+        this.accessibleResources.add(accessibleResources);
+    }
+
+    public void setChildGroups(Set<HasChildGroup> childGroups) {
+        this.childGroups = childGroups;
+    }
+
+    public HasChildGroup getChildGroupInPointers() {
+        return ChildGroupInPointers;
+    }
+
+    public void setChildGroupInPointers(HasChildGroup childGroupInPointers) {
+        this.ChildGroupInPointers = childGroupInPointers;
+    }
+
+    public void setChildUsers(Set<HasChildUser> childUsers) {
+        this.childUsers = childUsers;
+    }
+
+    public Set<HasParentGroup> getParentGroupInPointers() {
+        return parentGroupInPointers;
+    }
+
+    private void addParentGroupInPointer(HasParentGroup parentGroup) {
+        this.parentGroupInPointers.add(parentGroup);
+    }
+
+    public HasParentGroup getParent() {
+        return parent;
+    }
+
+    public void setParent(HasParentGroup parent) {
+        this.parent = parent;
+    }
+
+    public void setMemberUsersInPointers(Set<MemberOf> memberUsersInPointers) {
+        this.memberUsersInPointers = memberUsersInPointers;
+    }
+
+    public void addChildUser(User user, String membership, long relationshipCreatedAt,
+                             long relationshipModifiedAt, Map<String, String> relationshipProperties) {
+        MemberOf memberOf = new MemberOf();
+        memberOf.setMembershipType(membership);
+        memberOf.setStartEntity(user);
+        memberOf.setEndEntity(this);
+        user.addMemberGroup(memberOf);
+        this.addMemberUserInPointer(memberOf);
+
+        HasChildUser childUser = new HasChildUser();
+        childUser.setUserType(membership);
+        childUser.setStartEntity(this);
+        childUser.setEndEntity(user);
+        user.addGroup(childUser);
+        this.addChildUser(childUser);
+
+        if (relationshipCreatedAt != 0) {
+            memberOf.setCreatedAt(relationshipCreatedAt);
+            childUser.setCreatedAt(relationshipCreatedAt);
+        }
+        if (relationshipModifiedAt != 0) {
+            memberOf.setLastModifiedAt(relationshipModifiedAt);
+            childUser.setLastModifiedAt(relationshipModifiedAt);
+        }
+        if (relationshipProperties != null) {
+            memberOf.setProperties(relationshipProperties);
+            childUser.setProperties(relationshipProperties);
+        }
+
+    }
+
+
+    public void addChildGroup(Group group, long relationShipCreatedAt,
+                              long relationShipModifiedAt, Map<String, String> relationshipProperties) {
+
+        HasChildGroup hasChildGroup = new HasChildGroup();
+        hasChildGroup.setStartEntity(this);
+        hasChildGroup.setEndEntity(group);
+        this.addChildGroup(hasChildGroup);
+        group.setChildGroupInPointers(hasChildGroup);
+
+        HasParentGroup hasParentGroup = new HasParentGroup();
+        hasParentGroup.setStartEntity(group);
+        hasParentGroup.setEndEntity(this);
+        group.setParent(hasParentGroup);
+        this.addParentGroupInPointer(hasParentGroup);
+
+        if (relationShipCreatedAt != 0) {
+            hasParentGroup.setCreatedAt(relationShipCreatedAt);
+            hasChildGroup.setCreatedAt(relationShipCreatedAt);
+        }
+        if (relationShipModifiedAt != 0) {
+            hasParentGroup.setLastModifiedAt(relationShipModifiedAt);
+            hasChildGroup.setLastModifiedAt(relationShipModifiedAt);
+        }
+        if (relationshipProperties != null) {
+            hasParentGroup.setProperties(relationshipProperties);
+            hasChildGroup.setProperties(relationshipProperties);
+        }
+
+    }
+
+
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/Resource.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/Resource.java
new file mode 100644
index 0000000..5df5e77
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/Resource.java
@@ -0,0 +1,215 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.nodes;
+
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships.*;
+import org.neo4j.ogm.annotation.*;
+import org.neo4j.ogm.annotation.Relationship;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+@NodeEntity
+public class Resource extends Entity {
+
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    @Property(name = "name")
+    private String name;
+
+    @Relationship(type = "HAS", direction = Relationship.INCOMING)
+    private Has tenantPointer;
+
+    @Relationship(type = "HAS_CHILD_RESOURCE")
+    private Set<HasChildResource> childResourceSet = new HashSet<>();
+
+    @Relationship(type = "HAS_CHILD_RESOURCE", direction = Relationship.INCOMING)
+    private HasChildResource parentInPointer;
+
+    @Relationship(type = "HAS_PARENT_RESOURCE", direction = Relationship.INCOMING)
+    private Set<HasParentResource> childInPointers = new HashSet<>();
+
+    @Relationship(type = "HAS_PARENT_RESOURCE")
+    private HasParentResource parent;
+
+    @Relationship(type = "SHARED_WITH")
+    private Set<SharedWith> shares = new HashSet<>();
+
+    @Relationship(type = "HAS_ACCESS", direction = Relationship.INCOMING)
+    private Set<HasAccess> accesses = new HashSet<>();
+
+    public Resource() {
+    }
+
+
+    public Has getTenantPointer() {
+        return tenantPointer;
+    }
+
+    public void setTenantPointer(Has tenantPointer) {
+        this.tenantPointer = tenantPointer;
+    }
+
+    public Set<HasChildResource> getChildResourceSet() {
+        return childResourceSet;
+    }
+
+    public void addChildResource(HasChildResource childResource) {
+        this.childResourceSet.add(childResource);
+    }
+
+    public Set<HasParentResource> getChildInPointers() {
+        return childInPointers;
+    }
+
+    public void addChildInPointers(HasParentResource childInPointers) {
+        this.childInPointers.add(childInPointers);
+    }
+
+    public HasParentResource getParent() {
+        return parent;
+    }
+
+    public void setParent(HasParentResource parent) {
+        this.parent = parent;
+    }
+
+    public HasChildResource getParentInPointer() {
+        return parentInPointer;
+    }
+
+    public void setParentInPointer(HasChildResource parentInPointer) {
+        this.parentInPointer = parentInPointer;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Set<SharedWith> getShares() {
+        return shares;
+    }
+
+    public void addShares(SharedWith share) {
+        this.shares.add(share);
+    }
+
+    public Set<HasAccess> getAccesses() {
+        return accesses;
+    }
+
+    public void addAccess(HasAccess access) {
+        this.accesses.add(access);
+    }
+
+    @Override
+    public Long getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public void addChildResource(Resource resource, long createdAt, long lastModifiedAt,
+                                 Map<String, String> properties) {
+        HasChildResource hasChildResource = new HasChildResource();
+        hasChildResource.setStartEntity(this);
+        hasChildResource.setEndEntity(resource);
+        this.addChildResource(hasChildResource);
+        resource.setParentInPointer(hasChildResource);
+
+        HasParentResource hasParentResource = new HasParentResource();
+        hasParentResource.setStartEntity(resource);
+        hasParentResource.setEndEntity(this);
+        resource.setParent(hasParentResource);
+        this.addChildInPointers(hasParentResource);
+
+        if (createdAt != 0) {
+            hasParentResource.setCreatedAt(createdAt);
+            hasChildResource.setCreatedAt(createdAt);
+        }
+        if (lastModifiedAt != 0) {
+            hasParentResource.setLastModifiedAt(lastModifiedAt);
+            hasChildResource.setLastModifiedAt(lastModifiedAt);
+        }
+        if (properties != null) {
+            hasParentResource.setProperties(properties);
+            hasChildResource.setProperties(properties);
+        }
+
+    }
+
+    public void shareWithAUser(User user, String permission, long createdAt, long lastModifiedAt,
+                               Map<String, String> properties) {
+
+        SharedWith sharedWith = new SharedWith();
+        sharedWith.setStartEntity(this);
+        sharedWith.setEndEntity(user);
+        sharedWith.setPermissionType(permission);
+        this.addShares(sharedWith);
+        user.addSharedResource(sharedWith);
+
+        HasAccess hasAccess = new HasAccess();
+        hasAccess.setStartEntity(user);
+        hasAccess.setEndEntity(this);
+        hasAccess.setPermissionType(permission);
+        this.addAccess(hasAccess);
+        user.addAccessibleResources(hasAccess);
+
+        if (createdAt != 0) {
+            sharedWith.setCreatedAt(createdAt);
+            hasAccess.setCreatedAt(createdAt);
+        }
+        if (lastModifiedAt != 0) {
+            sharedWith.setLastModifiedAt(lastModifiedAt);
+            hasAccess.setLastModifiedAt(lastModifiedAt);
+        }
+        if (properties != null) {
+            sharedWith.setProperties(properties);
+            hasAccess.setProperties(properties);
+        }
+
+    }
+
+    public void shareWithAGroup(Group group, String permission, long relationshipCreatedAt, long relationshipLastModifiedAt,
+                                Map<String, String> relationshipProperties) {
+
+        SharedWith sharedWith = new SharedWith();
+        sharedWith.setStartEntity(this);
+        sharedWith.setEndEntity(group);
+        sharedWith.setPermissionType(permission);
+        this.addShares(sharedWith);
+        group.addSharedResourcesInPointers(sharedWith);
+
+        HasAccess hasAccess = new HasAccess();
+        hasAccess.setStartEntity(group);
+        hasAccess.setEndEntity(this);
+        hasAccess.setPermissionType(permission);
+        this.addAccess(hasAccess);
+        group.addAccessibleResources(hasAccess);
+
+        if (relationshipCreatedAt != 0) {
+            sharedWith.setCreatedAt(relationshipCreatedAt);
+            hasAccess.setCreatedAt(relationshipCreatedAt);
+        }
+        if (relationshipLastModifiedAt != 0) {
+            sharedWith.setLastModifiedAt(relationshipLastModifiedAt);
+            hasAccess.setLastModifiedAt(relationshipLastModifiedAt);
+        }
+        if (relationshipProperties != null) {
+            sharedWith.setProperties(relationshipProperties);
+            hasAccess.setProperties(relationshipProperties);
+        }
+
+
+    }
+
+
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/Role.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/Role.java
new file mode 100644
index 0000000..e70579a
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/Role.java
@@ -0,0 +1,37 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.nodes;
+
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships.HasRole;
+import org.neo4j.ogm.annotation.NodeEntity;
+import org.neo4j.ogm.annotation.Property;
+import org.neo4j.ogm.annotation.Relationship;
+
+@NodeEntity
+public class Role extends Entity {
+
+    @Property(name = "scope")
+    private String scope;
+
+
+    @Relationship(type = "HAS_ROLE", direction = Relationship.INCOMING)
+    private HasRole hasRole;
+
+    public Role() {
+    }
+
+    public String getScope() {
+        return scope;
+    }
+
+    public void setScope(String scope) {
+        this.scope = scope;
+    }
+
+
+    public HasRole getHasRole() {
+        return hasRole;
+    }
+
+    public void setHasRole(HasRole hasRole) {
+        this.hasRole = hasRole;
+    }
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/ServiceAccount.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/ServiceAccount.java
new file mode 100644
index 0000000..2802c5c
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/ServiceAccount.java
@@ -0,0 +1,29 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.nodes;
+
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships.Has;
+import org.neo4j.ogm.annotation.NodeEntity;
+import org.neo4j.ogm.annotation.Property;
+import org.neo4j.ogm.annotation.Relationship;
+
+@NodeEntity
+public class ServiceAccount extends Entity {
+
+    @Property(name = "status")
+    private String status;
+
+
+    @Relationship(type = "HAS", direction = Relationship.INCOMING)
+    private Has hasRole;
+
+    public ServiceAccount() {
+
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/Tenant.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/Tenant.java
new file mode 100644
index 0000000..c8f619b
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/Tenant.java
@@ -0,0 +1,125 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.nodes;
+
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships.Has;
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships.HasRole;
+import org.neo4j.ogm.annotation.NodeEntity;
+import org.neo4j.ogm.annotation.Property;
+import org.neo4j.ogm.annotation.Relationship;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+@NodeEntity
+public class Tenant extends Entity {
+    @Property(name = "tenant_id")
+    private String tenantId;
+    @Property(name = "domain")
+    private String domain;
+    @Property(name = "name")
+    private String name;
+    @Property(name = "requester_email")
+    private String requesterEmail;
+    @Property(name = "scope")
+    private String scope;
+    @Property(name = "redirect_uris")
+    private List<String> redirectURIs;
+
+    @Relationship(type = "HAS_ROLE")
+    private Set<HasRole> roles = new HashSet<>();
+
+    @Relationship(type = "HAS")
+    private Set<Has> entities = new HashSet<>();
+
+
+    public Tenant() {
+    }
+
+    public String getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(String tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getDomain() {
+        return domain;
+    }
+
+    public void setDomain(String domain) {
+        this.domain = domain;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getRequesterEmail() {
+        return requesterEmail;
+    }
+
+    public void setRequesterEmail(String requesterEmail) {
+        this.requesterEmail = requesterEmail;
+    }
+
+    public String getScope() {
+        return scope;
+    }
+
+    public void setScope(String scope) {
+        this.scope = scope;
+    }
+
+    public List<String> getRedirectURIs() {
+        return redirectURIs;
+    }
+
+    public void setRedirectURIs(List<String> redirectURIs) {
+        this.redirectURIs = redirectURIs;
+    }
+
+    public Set<HasRole> getRoles() {
+        return roles;
+    }
+
+    public void setRoles(Set<HasRole> roles) {
+        this.roles = roles;
+    }
+
+
+    public Set<Has> getEntities() {
+        return entities;
+    }
+
+    public void addEntities(Has entity) {
+        this.entities.add(entity);
+    }
+
+    public void add(Entity entity, long relationShipCreatedAt, long relationShipModifiedAt,
+                    Map<String, String> relationshipProperties) {
+
+        Has has = new Has();
+        has.setStartEntity(this);
+        has.setEndEntity(entity);
+        entity.setTenantInPointer(has);
+        this.addEntities(has);
+
+        if (relationShipCreatedAt != 0) {
+            has.setCreatedAt(relationShipCreatedAt);
+        }
+        if (relationShipModifiedAt != 0) {
+            has.setLastModifiedAt(relationShipModifiedAt);
+        }
+        if (relationshipProperties != null) {
+            has.setProperties(relationshipProperties);
+        }
+
+
+    }
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/User.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/User.java
new file mode 100644
index 0000000..07b1979
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/User.java
@@ -0,0 +1,132 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.nodes;
+
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships.*;
+import org.neo4j.ogm.annotation.NodeEntity;
+import org.neo4j.ogm.annotation.Property;
+import org.neo4j.ogm.annotation.Relationship;
+
+import java.util.HashSet;
+import java.util.Set;
+
+@NodeEntity
+public class User extends Entity {
+    @Property(name = "name")
+    private String userName;
+    @Property(name = "first_name")
+    private String firstName;
+    @Property(name = "last_name")
+    private String lastName;
+    @Property(name = "email")
+    private String email;
+    @Property(name = "status")
+    private String status;
+
+    @Relationship(type = "BELONGS")
+    private Belongs belongs;
+
+    @Relationship(type = "HAS", direction = Relationship.INCOMING)
+    private Has hasRole;
+
+    @Relationship(type = "MEMBER_OF")
+    private Set<MemberOf> memberGroups = new HashSet<>();
+
+    @Relationship(type = "HAS_CHILD_USER", direction = Relationship.INCOMING)
+    private Set<HasChildUser> groups = new HashSet<>();
+
+    @Relationship(type = "SHARED_WITH", direction = Relationship.INCOMING)
+    private Set<SharedWith> sharedResources = new HashSet<>();
+
+    @Relationship(type = "HAS_ACCESS")
+    private Set<HasAccess> accessibleResources = new HashSet<>();
+
+    public User() {
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getFirstName() {
+        return firstName;
+    }
+
+    public void setFirstName(String firstName) {
+        this.firstName = firstName;
+    }
+
+    public String getLastName() {
+        return lastName;
+    }
+
+    public void setLastName(String lastName) {
+        this.lastName = lastName;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public Belongs getBelongs() {
+        return belongs;
+    }
+
+    public void setBelongs(Belongs belongs) {
+        this.belongs = belongs;
+    }
+
+    public Has getHasRole() {
+        return hasRole;
+    }
+
+    public void setHasRole(Has hasRole) {
+        this.hasRole = hasRole;
+    }
+
+    public Set<MemberOf> getMemberGroups() {
+        return memberGroups;
+    }
+
+    public void addMemberGroup(MemberOf memberGroup) {
+        this.memberGroups.add(memberGroup);
+    }
+
+    public Set<HasChildUser> getGroups() {
+        return groups;
+    }
+
+    public void addGroup(HasChildUser hasChildUser) {
+        this.groups.add(hasChildUser);
+    }
+
+    public Set<SharedWith> getSharedResources() {
+        return sharedResources;
+    }
+
+    public void addSharedResource(SharedWith sharedResource) {
+        this.sharedResources.add(sharedResource);
+    }
+
+    public Set<HasAccess> getAccessibleResources() {
+        return accessibleResources;
+    }
+
+    public void addAccessibleResources(HasAccess accessibleResources) {
+        this.accessibleResources.add(accessibleResources);
+    }
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/Belongs.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/Belongs.java
new file mode 100644
index 0000000..0f0e8ce
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/Belongs.java
@@ -0,0 +1,9 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships;
+
+import org.neo4j.ogm.annotation.RelationshipEntity;
+
+@RelationshipEntity(type = "BELONGS")
+public class Belongs extends Relationship {
+
+
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/ConfiguredWith.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/ConfiguredWith.java
new file mode 100644
index 0000000..22cbfcf
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/ConfiguredWith.java
@@ -0,0 +1,7 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships;
+
+import org.neo4j.ogm.annotation.RelationshipEntity;
+
+@RelationshipEntity(type = "CONFIGURED_WITH")
+public class ConfiguredWith extends Relationship {
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/Has.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/Has.java
new file mode 100644
index 0000000..c315762
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/Has.java
@@ -0,0 +1,9 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships;
+
+import org.neo4j.ogm.annotation.RelationshipEntity;
+
+@RelationshipEntity(type = "HAS")
+public class Has extends Relationship {
+
+
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasAccess.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasAccess.java
new file mode 100644
index 0000000..b76369b
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasAccess.java
@@ -0,0 +1,23 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships;
+
+import org.neo4j.ogm.annotation.Property;
+import org.neo4j.ogm.annotation.RelationshipEntity;
+
+@RelationshipEntity(type = "HAS_ACCESS")
+public class HasAccess extends Relationship {
+
+    public HasAccess() {
+    }
+
+    @Property(name = "permission_type")
+    private String permissionType;
+
+    public String getPermissionType() {
+        return permissionType;
+    }
+
+    public void setPermissionType(String permissionType) {
+        this.permissionType = permissionType;
+    }
+
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasChildGroup.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasChildGroup.java
new file mode 100644
index 0000000..a97bfb8
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasChildGroup.java
@@ -0,0 +1,9 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships;
+
+import org.neo4j.ogm.annotation.RelationshipEntity;
+
+@RelationshipEntity(type = "HAS_CHILD_GROUP")
+public class HasChildGroup extends Relationship {
+
+
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasChildResource.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasChildResource.java
new file mode 100644
index 0000000..2a29c8d
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasChildResource.java
@@ -0,0 +1,8 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships;
+
+import org.neo4j.ogm.annotation.RelationshipEntity;
+
+@RelationshipEntity(type = "HAS_CHILD_RESOURCE")
+public class HasChildResource extends Relationship {
+
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasChildUser.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasChildUser.java
new file mode 100644
index 0000000..bc04572
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasChildUser.java
@@ -0,0 +1,19 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships;
+
+import org.neo4j.ogm.annotation.Property;
+import org.neo4j.ogm.annotation.RelationshipEntity;
+
+@RelationshipEntity(type = "HAS_CHILD_USER")
+public class HasChildUser extends Relationship {
+
+    @Property(name = "user_type")
+    private String userType;
+
+    public String getUserType() {
+        return userType;
+    }
+
+    public void setUserType(String userType) {
+        this.userType = userType;
+    }
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasParentGroup.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasParentGroup.java
new file mode 100644
index 0000000..fe07ddb
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasParentGroup.java
@@ -0,0 +1,19 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships;
+
+import org.neo4j.ogm.annotation.Property;
+import org.neo4j.ogm.annotation.RelationshipEntity;
+
+@RelationshipEntity(type = "HAS_PARENT_GROUP")
+public class HasParentGroup extends Relationship{
+
+    @Property(name = "membership_type")
+    private String membershipType;
+
+    public String getMembershipType() {
+        return membershipType;
+    }
+
+    public void setMembershipType(String membershipType) {
+        this.membershipType = membershipType;
+    }
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasParentResource.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasParentResource.java
new file mode 100644
index 0000000..d8a0340
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasParentResource.java
@@ -0,0 +1,7 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships;
+
+import org.neo4j.ogm.annotation.RelationshipEntity;
+
+@RelationshipEntity(type = "HAS_PARENT_RESOURCE")
+public class HasParentResource extends Relationship{
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasRole.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasRole.java
new file mode 100644
index 0000000..5b02f4e
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasRole.java
@@ -0,0 +1,8 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships;
+
+import org.neo4j.ogm.annotation.RelationshipEntity;
+
+@RelationshipEntity(type = "HAS_ROLE")
+public class HasRole extends Relationship{
+
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/MemberOf.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/MemberOf.java
new file mode 100644
index 0000000..f381f33
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/MemberOf.java
@@ -0,0 +1,19 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships;
+
+import org.neo4j.ogm.annotation.Property;
+import org.neo4j.ogm.annotation.RelationshipEntity;
+
+@RelationshipEntity(type = "MEMBER_OF")
+public class MemberOf extends Relationship {
+
+    @Property(name = "membership_type")
+    private String membershipType;
+
+    public String getMembershipType() {
+        return membershipType;
+    }
+
+    public void setMembershipType(String membershipType) {
+        this.membershipType = membershipType;
+    }
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/Relationship.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/Relationship.java
new file mode 100644
index 0000000..f7ccdff
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/Relationship.java
@@ -0,0 +1,81 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships;
+
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.nodes.Entity;
+import org.neo4j.ogm.annotation.*;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public abstract class Relationship {
+    @Id
+    @GeneratedValue
+    private Long id;
+
+
+    @Property(name = "created_at")
+    private long createdAt = System.currentTimeMillis();
+
+    @Property(name = "last_modified_at")
+    private long lastModifiedAt = System.currentTimeMillis();
+
+
+    @StartNode
+    private Entity startEntity;
+
+    @EndNode
+    private Entity endEntity;
+
+
+    @Properties(prefix = "custom")
+    private Map<String, String> properties = new HashMap<>();
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public long getCreatedAt() {
+        return createdAt;
+    }
+
+    public void setCreatedAt(long createdAt) {
+        this.createdAt = createdAt;
+    }
+
+    public long getLastModifiedAt() {
+        return lastModifiedAt;
+    }
+
+    public void setLastModifiedAt(long lastModifiedAt) {
+        this.lastModifiedAt = lastModifiedAt;
+    }
+
+
+    public Map<String, String> getProperties() {
+        return properties;
+    }
+
+    public void setProperties(Map<String, String> properties) {
+        this.properties = properties;
+    }
+
+
+    public Entity getStartEntity() {
+        return startEntity;
+    }
+
+    public void setStartEntity(Entity startEntity) {
+        this.startEntity = startEntity;
+    }
+
+    public Entity getEndEntity() {
+        return endEntity;
+    }
+
+    public void setEndEntity(Entity endEntity) {
+        this.endEntity = endEntity;
+    }
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/SharedWith.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/SharedWith.java
new file mode 100644
index 0000000..b3434cb
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/SharedWith.java
@@ -0,0 +1,25 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships;
+
+import org.neo4j.ogm.annotation.Property;
+import org.neo4j.ogm.annotation.RelationshipEntity;
+
+@RelationshipEntity(type = "SHARED_WITH")
+public class SharedWith extends Relationship {
+
+
+    public SharedWith() {
+
+    }
+
+    @Property(name = "permission_type")
+    private String permissionType;
+
+    public String getPermissionType() {
+        return permissionType;
+    }
+
+    public void setPermissionType(String permissionType) {
+        this.permissionType = permissionType;
+    }
+
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/exceptions/DBConnectorException.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/exceptions/DBConnectorException.java
new file mode 100644
index 0000000..c4860d8
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/exceptions/DBConnectorException.java
@@ -0,0 +1,10 @@
+package org.apache.airavata.datalake.metadata.db.service.exceptions;
+
+public class DBConnectorException extends RuntimeException{
+    String msg;
+
+    public DBConnectorException(String message, Throwable throwable) {
+        super(message,throwable);
+        this.msg = message;
+    }
+}
diff --git a/metadata-service/db-service/src/main/resources/application.properties b/metadata-service/db-service/src/main/resources/application.properties
new file mode 100644
index 0000000..f0d53ae
--- /dev/null
+++ b/metadata-service/db-service/src/main/resources/application.properties
@@ -0,0 +1,23 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
+#
+
+server.port=9090
+spring.neo4j.uri=bolt://neo4j:blastcovid19@149.165.156.173
+spring.neo4j.authentication.username=username
+spring.neo4j.authentication.password=password
diff --git a/metadata-service/db-service/src/main/resources/applicationContext.xml b/metadata-service/db-service/src/main/resources/applicationContext.xml
new file mode 100644
index 0000000..adeadaf
--- /dev/null
+++ b/metadata-service/db-service/src/main/resources/applicationContext.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans
+        http://www.springframework.org/schema/beans/spring-beans.xsd
+        http://www.springframework.org/schema/context
+        http://www.springframework.org/schema/context/spring-context.xsd">
+
+    <bean id="dbConnector" class="org.apache.airavata.datalake.metadata.db.service.backend.neo4j.Neo4JConnector"
+          init-method="init" destroy-method="close"></bean>
+
+</beans>
\ No newline at end of file
diff --git a/metadata-service/metadata-service.iml b/metadata-service/metadata-service.iml
new file mode 100644
index 0000000..5fa3710
--- /dev/null
+++ b/metadata-service/metadata-service.iml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_11">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/target/maven-shared-archive-resources" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/target/maven-shared-archive-resources" isTestSource="false" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/metadata-service/pom.xml b/metadata-service/pom.xml
new file mode 100644
index 0000000..7125b8a
--- /dev/null
+++ b/metadata-service/pom.xml
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>airavata-data-lake</artifactId>
+        <groupId>org.apache.airavata.data.lake</groupId>
+        <version>0.01-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>metadata-service</artifactId>
+    <packaging>pom</packaging>
+    <modules>
+        <module>db-service</module>
+    </modules>
+
+    <properties>
+        <maven.compiler.source>11</maven.compiler.source>
+        <maven.compiler.target>11</maven.compiler.target>
+    </properties>
+    <dependencyManagement>
+        <dependencies>
+            <!-- neo4J servide dependencies-->
+<!--            <dependency>-->
+<!--                <groupId>org.springframework.boot</groupId>-->
+<!--                <artifactId>spring-boot-starter-parent</artifactId>-->
+<!--                <version>${spring.boot.version}</version>-->
+<!--                <type>pom</type>-->
+<!--                <scope>import</scope>-->
+<!--            </dependency>-->
+<!--            <dependency>-->
+<!--                <groupId>org.springframework.cloud</groupId>-->
+<!--                <artifactId>spring-cloud-dependencies</artifactId>-->
+<!--                <version>${spring.cloud.version}</version>-->
+<!--                <type>pom</type>-->
+<!--                <scope>import</scope>-->
+<!--            </dependency>-->
+<!--            <dependency>-->
+<!--                <groupId>io.github.lognet</groupId>-->
+<!--                <artifactId>grpc-spring-boot-starter</artifactId>-->
+<!--                <version>${grpc.spring.boot.version}</version>-->
+<!--                <exclusions>-->
+<!--                    <exclusion>-->
+<!--                        <groupId>io.grpc</groupId>-->
+<!--                        <artifactId>grpc-netty</artifactId>-->
+<!--                    </exclusion>-->
+<!--                    <exclusion>-->
+<!--                        <groupId>org.springframework.boot</groupId>-->
+<!--                        <artifactId>spring-boot-starter</artifactId>-->
+<!--                    </exclusion>-->
+<!--                </exclusions>-->
+<!--            </dependency>-->
+<!--            <dependency>-->
+<!--                <groupId>io.grpc</groupId>-->
+<!--                <artifactId>grpc-stub</artifactId>-->
+<!--                <version>${io.grpc.version}</version>-->
+<!--            </dependency>-->
+<!--            <dependency>-->
+<!--                <groupId>io.grpc</groupId>-->
+<!--                <artifactId>grpc-protobuf</artifactId>-->
+<!--                <version>${io.grpc.version}</version>-->
+<!--            </dependency>-->
+<!--            <dependency>-->
+<!--                <groupId>io.grpc</groupId>-->
+<!--                <artifactId>grpc-netty</artifactId>-->
+<!--                <version>${io.grpc.version}</version>-->
+<!--            </dependency>-->
+<!--            <dependency>-->
+<!--                <groupId>javax.annotation</groupId>-->
+<!--                <artifactId>javax.annotation-api</artifactId>-->
+<!--                <version>${javax.annotation.version}</version>-->
+<!--            </dependency>-->
+<!--            <dependency>-->
+<!--                <groupId>org.springframework.cloud</groupId>-->
+<!--                <artifactId>spring-cloud-starter-sleuth</artifactId>-->
+<!--                <version>${spring.cloud.slueth.version}</version>-->
+<!--            </dependency>-->
+<!--            <dependency>-->
+<!--                <groupId>org.springframework.cloud</groupId>-->
+<!--                <artifactId>spring-cloud-sleuth-zipkin</artifactId>-->
+<!--                <version>${spring.cloud.slueth.version}</version>-->
+<!--            </dependency>-->
+<!--            <dependency>-->
+<!--                <groupId>org.springframework.cloud</groupId>-->
+<!--                <artifactId>spring-cloud-starter-vault-config</artifactId>-->
+<!--                <version>${spring.boot.version}</version>-->
+<!--            </dependency>-->
+            <!--        <dependency>-->
+            <!--            <groupId>org.springframework.data</groupId>-->
+            <!--            <artifactId>spring-data-neo4j</artifactId>-->
+            <!--            <version>${spring.data.neo4j.version}</version>-->
+            <!--        </dependency>-->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-web</artifactId>
+                <version>2.4.2</version>
+            </dependency>
+<!--            <dependency>-->
+<!--                <groupId>org.springframework.data</groupId>-->
+<!--                <artifactId>spring-data-neo4j</artifactId>-->
+<!--                <version>5.2.0</version>-->
+<!--            </dependency>-->
+<!--            &lt;!&ndash; https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-neo4j &ndash;&gt;-->
+<!--            <dependency>-->
+<!--                <groupId>org.springframework.boot</groupId>-->
+<!--                <artifactId>spring-boot-starter-data-neo4j</artifactId>-->
+<!--                <version>2.4.2</version>-->
+<!--            </dependency>-->
+                    <dependency>
+                        <groupId>org.neo4j</groupId>
+                        <artifactId>neo4j-ogm-core</artifactId>
+                        <version>3.2.20</version>
+                    </dependency>
+            <dependency>
+                <groupId>org.neo4j</groupId>
+                <artifactId>neo4j-ogm-bolt-driver</artifactId>
+                <version>3.2.20</version>
+            </dependency>
+<!--            <dependency>-->
+<!--                <groupId>org.springframework.data</groupId>-->
+<!--                <artifactId>spring-data-commons</artifactId>-->
+<!--                <version>2.4.2</version>-->
+<!--            </dependency>-->
+
+        </dependencies>
+    </dependencyManagement>
+
+
+</project>
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 48bcf01..c0bb353 100644
--- a/pom.xml
+++ b/pom.xml
@@ -20,7 +20,8 @@
     under the License.
 
 -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 
     <modelVersion>4.0.0</modelVersion>
 
@@ -29,6 +30,7 @@
     </prerequisites>
     <modules>
         <module>data-orchestrator</module>
+        <module>metadata-service</module>
     </modules>
 
     <parent>
@@ -65,4 +67,77 @@
         </plugins>
     </build>
 
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <org.slf4j.version>1.7.25</org.slf4j.version>
+        <log4j.version>1.2.17</log4j.version>
+        <thrift.version>0.12.0</thrift.version>
+        <openjpa.version>2.4.3</openjpa.version>
+        <mysql.connector.version>5.1.34</mysql.connector.version>
+        <maven.assembly.plugin>3.3.0</maven.assembly.plugin>
+        <junit.version>4.8.1</junit.version>
+        <jmockit.version>1.8</jmockit.version>
+        <java.version>11</java.version>
+        <javax.annotation.version>1.3.2</javax.annotation.version>
+        <maven.compiler.plugin>3.8.1</maven.compiler.plugin>
+
+        <protobuf.maven.plugin>0.5.1</protobuf.maven.plugin>
+        <os.maven.plugin>1.5.0.Final</os.maven.plugin>
+
+        <!-- Spring dependencies -->
+        <spring.boot.version>2.4.2</spring.boot.version>
+        <spring.cloud.version>Greenwich.RELEASE</spring.cloud.version>
+        <grpc.spring.boot.version>2.4.4</grpc.spring.boot.version>
+
+        <spring.cloud.stream.version>2.0.0.RELEASE</spring.cloud.stream.version>
+        <spring.cloud.slueth.version>2.1.6.RELEASE</spring.cloud.slueth.version>
+        <spring.data.neo4j.version>6.0.3</spring.data.neo4j.version>
+
+        <io.grpc.version>1.25.0</io.grpc.version>
+        <google.common.protos>1.17.0</google.common.protos>
+        <io.micrometer.version>1.3.1</io.micrometer.version>
+        <brave.version>5.9.1</brave.version>
+
+        <docker.image.prefix>apachecustos</docker.image.prefix>
+        <docker.image.repo>custos</docker.image.repo>
+        <docker.plugin.version>1.4.13</docker.plugin.version>
+
+        <helm.maven.plugin.version>2.8.0</helm.maven.plugin.version>
+        <maven.assembly.plugin.version>3.2.0</maven.assembly.plugin.version>
+
+        <mysql.connector.java>8.0.18</mysql.connector.java>
+        <javax.persistance>1.0.2</javax.persistance>
+
+        <keycloak.admin.version>7.0.0</keycloak.admin.version>
+
+        <reasteasy.client.version>3.0.14.Final</reasteasy.client.version>
+
+        <com.google.protobuf.util>3.11.3</com.google.protobuf.util>
+
+        <springfox.swagger.version>2.9.2</springfox.swagger.version>
+        <org.wso2.charon>3.3.16</org.wso2.charon>
+        <jaxb.version>2.1</jaxb.version>
+
+        <kube.java.client.version>5.0.0</kube.java.client.version>
+
+        <testng.version>6.8</testng.version>
+        <org.json.version>20190722</org.json.version>
+
+        <apache.rat.plugin.version>0.13</apache.rat.plugin.version>
+
+        <maven.surefile.plugin.version>3.0.0-M4</maven.surefile.plugin.version>
+
+        <log.back.version>1.2.3</log.back.version>
+
+        <com.jcraft.version>0.1.55</com.jcraft.version>
+
+        <io.commons.version>2.7</io.commons.version>
+
+        <com.codahale.version>0.7.0</com.codahale.version>
+
+
+    </properties>
+
 </project>