Dotnet Rewrite
This commit is contained in:
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
src/cli/bin
|
||||||
|
src/cli/obj
|
||||||
|
src/embeddingsearch/bin
|
||||||
|
src/embeddingsearch/obj
|
||||||
|
src/server
|
||||||
41
.vscode/tasks.json
vendored
Normal file
41
.vscode/tasks.json
vendored
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"version": "2.0.0",
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"label": "build",
|
||||||
|
"command": "dotnet",
|
||||||
|
"type": "process",
|
||||||
|
"args": [
|
||||||
|
"build",
|
||||||
|
"${workspaceFolder}/src/testapp/testapp.sln",
|
||||||
|
"/property:GenerateFullPaths=true",
|
||||||
|
"/consoleloggerparameters:NoSummary;ForceNoAlign"
|
||||||
|
],
|
||||||
|
"problemMatcher": "$msCompile"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "publish",
|
||||||
|
"command": "dotnet",
|
||||||
|
"type": "process",
|
||||||
|
"args": [
|
||||||
|
"publish",
|
||||||
|
"${workspaceFolder}/src/testapp/testapp.sln",
|
||||||
|
"/property:GenerateFullPaths=true",
|
||||||
|
"/consoleloggerparameters:NoSummary;ForceNoAlign"
|
||||||
|
],
|
||||||
|
"problemMatcher": "$msCompile"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "watch",
|
||||||
|
"command": "dotnet",
|
||||||
|
"type": "process",
|
||||||
|
"args": [
|
||||||
|
"watch",
|
||||||
|
"run",
|
||||||
|
"--project",
|
||||||
|
"${workspaceFolder}/src/testapp/testapp.sln"
|
||||||
|
],
|
||||||
|
"problemMatcher": "$msCompile"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
133
README.md
133
README.md
@@ -1,9 +1,13 @@
|
|||||||
# embeddingsearch
|
# embeddingsearch
|
||||||
**This is still highly work-in-progress**
|
**This is still highly work-in-progress**
|
||||||
|
|
||||||
Embeddingsearch is a python library that uses Embedding Similarity Search (similiarly to [Magna](https://github.com/yousef-rafat/Magna/tree/main)) to semantically compare a given input to a database of pre-processed entries.
|
Embeddingsearch is a DotNet C# library that uses Embedding Similarity Search (similiarly to [Magna](https://github.com/yousef-rafat/Magna/tree/main)) to semantically compare a given input to a database of pre-processed entries.
|
||||||
|
|
||||||
|
This repository comes with
|
||||||
|
- the library
|
||||||
|
- a ready-to-use CLI module
|
||||||
|
- a REST API server (WIP) for if you want to process the data somewhere else or make it available to other languages.
|
||||||
|
|
||||||
When first implementing the idea, it was conceptualized to only import files into the database.
|
|
||||||
|
|
||||||
# How to set up
|
# How to set up
|
||||||
1. Install [ollama](https://ollama.com/download)
|
1. Install [ollama](https://ollama.com/download)
|
||||||
@@ -11,17 +15,14 @@ When first implementing the idea, it was conceptualized to only import files int
|
|||||||
3. [Install the depencencies](#installing-the-dependencies)
|
3. [Install the depencencies](#installing-the-dependencies)
|
||||||
4. [Set up a local mysql database](#mysql-database-setup)
|
4. [Set up a local mysql database](#mysql-database-setup)
|
||||||
|
|
||||||
# How to run the example script
|
|
||||||
1. Start the script `python3 dbtest.py`
|
|
||||||
2. Generate the index. Type in `index_folder` and submit. Then `target` and submit. (This might take a while with no GPU acceleration - go get some coffee)
|
|
||||||
3. After the indexing is done, you may prompt searches using `search`
|
|
||||||
|
|
||||||
# Installing the dependencies
|
# Installing the dependencies
|
||||||
## Ubuntu 24.04
|
## Ubuntu 24.04
|
||||||
`pip install mysql.connector`
|
1. `sudo apt update && sudo apt install dotnet-sdk-8.0 -y`
|
||||||
`apt install python3-magic`
|
|
||||||
## Windows
|
## Windows
|
||||||
TODO
|
1. Install Ubuntu in WSL (`wsl --install` and `wsl --install -d Ubuntu`)
|
||||||
|
2. Enter your WSL environment `wsl.exe` and configure it
|
||||||
|
3. Update via `sudo apt update && sudo apt upgrade -y && sudo snap refresh`
|
||||||
|
3. GOTO [Ubuntu 24.04](#Ubuntu-24.04)
|
||||||
|
|
||||||
# MySQL database setup
|
# MySQL database setup
|
||||||
1. Install mysql: `sudo apt install mysql-server` and connect to it: `sudo mysql -u root`
|
1. Install mysql: `sudo apt install mysql-server` and connect to it: `sudo mysql -u root`
|
||||||
@@ -29,30 +30,108 @@ TODO
|
|||||||
`CREATE DATABASE embeddingsearch; use embeddingsearch;`
|
`CREATE DATABASE embeddingsearch; use embeddingsearch;`
|
||||||
2. Create the user
|
2. Create the user
|
||||||
`CREATE USER embeddingsearch identified by "somepassword!"; GRANT ALL ON embeddingsearch.* TO embeddingsearch;`
|
`CREATE USER embeddingsearch identified by "somepassword!"; GRANT ALL ON embeddingsearch.* TO embeddingsearch;`
|
||||||
3. Create the tables
|
3. Create the tables: `dotnet build && src/cli/bin/Debug/net8.0/cli -h $mysql_ip -p $mysql_port -U $mysql_username -P $mysql_password --database --setup`
|
||||||
```sql
|
4. (optional) [Create a searchdomain](#create-a-searchdomain)
|
||||||
CREATE TABLE searchdomain (id int PRIMARY KEY auto_increment, name varchar(512), settings JSON);
|
|
||||||
|
|
||||||
CREATE TABLE query (id int PRIMARY KEY auto_increment, id_searchdomain int, query TEXT, FOREIGN KEY (id_searchdomain) REFERENCES searchdomain(id));
|
# Using the CLI
|
||||||
|
Before anything follow these steps:
|
||||||
|
1. Enter the project's `src` directory (used as the working directory in all examples)
|
||||||
|
2. Build the project: `dotnet build`
|
||||||
|
All user-defined parameters are denoted using the `$` symbol. I.e. `$mysql_ip` means: replace this with your MySQL IP address or set it as a local variable in your terminal session.
|
||||||
|
|
||||||
CREATE TABLE entity (id int PRIMARY KEY auto_increment, name varchar(512), probmethod varchar(128), id_searchdomain int, FOREIGN KEY (id_searchdomain) REFERENCES searchdomain(id));
|
## Database
|
||||||
|
### Create or check
|
||||||
|
`src/cli/bin/Debug/net8.0/cli -h $mysql_ip -p $mysql_port -U $mysql_username -P $mysql_password --database --create [--setup]`
|
||||||
|
|
||||||
CREATE TABLE queryresult (id int PRIMARY KEY auto_increment, id_query int, id_entity int, result double, FOREIGN KEY (id_query) REFERENCES query(id), FOREIGN KEY (id_entity) REFERENCES entity(id));
|
Without the `--setup` parameter a "dry-run" is performed. I.e. no actions are taken. Only the database is checked for read access and that all tables exist.
|
||||||
|
|
||||||
CREATE TABLE attribute (id int PRIMARY KEY auto_increment, id_entity int, attribute varchar(512), value longtext, FOREIGN KEY (id_entity) REFERENCES entity(id));
|
## Searchdomain
|
||||||
|
### Create a searchdomain
|
||||||
|
`src/cli/bin/Debug/net8.0/cli -h $mysql_ip -p $mysql_port -U $mysql_username -P $mysql_password --searchdomain --create -s $searchdomain_name`
|
||||||
|
|
||||||
CREATE TABLE datapoint (id int PRIMARY KEY auto_increment, name varchar(512), probmethod_embedding varchar(512), id_entity int, FOREIGN KEY (id_entity) REFERENCES entity(id));
|
Creates the searchdomain as specified under `$searchdomain_name`
|
||||||
|
|
||||||
CREATE TABLE embedding (id int PRIMARY KEY auto_increment, id_datapoint int, model varchar(512), embedding blob, FOREIGN KEY (id_datapoint) REFERENCES datapoint(id));
|
### List searchdomains
|
||||||
|
`src/cli/bin/Debug/net8.0/cli -h $mysql_ip -p $mysql_port -U $mysql_username -P $mysql_password --searchdomain --list`
|
||||||
|
|
||||||
|
List all searchdomains
|
||||||
|
|
||||||
|
### Update searchdomain
|
||||||
|
`src/cli/bin/Debug/net8.0/cli -h $mysql_ip -p $mysql_port -U $mysql_username -P $mysql_password --searchdomain --update -s $searchdomain_name [-n $searchdomain_newname] [-S $searchdomain_newsettings]`
|
||||||
|
|
||||||
|
Set a new name and/or update the settings for the searchdomain.
|
||||||
|
|
||||||
|
### Delete searchdomain
|
||||||
|
`src/cli/bin/Debug/net8.0/cli -h $mysql_ip -p $mysql_port -U $mysql_username -P $mysql_password --searchdomain --delete -s $searchdomain_name`
|
||||||
|
|
||||||
|
Deletes a searchdomain and its corresponding entites.
|
||||||
|
|
||||||
|
## Entity
|
||||||
|
### Create / Index entity
|
||||||
|
`src/cli/bin/Debug/net8.0/cli -h $mysql_ip -p $mysql_port -U $mysql_username -P $mysql_password --entity --index -o $ollama_URL -s $searchdomain_name -e $entity_as_JSON`
|
||||||
|
Creates the entity using the json string as specified under $entity_as_JSON
|
||||||
|
|
||||||
|
Example: `src/cli/bin/Debug/net8.0/cli -h $mysql_ip -p $mysql_port -U $mysql_username -P $mysql_password --entity --index -o $ollama_URL -s $searchdomain_name -e '{"name": "myfile.txt", "probmethod": "weighted_average", "searchdomain": "mysearchdomain", "attributes": {"mimetype": "text-plain"}, "datapoints": [{"name": "text", "text": "this is the full text", "probmethod_embedding": "weighted_average", "model": ["bge-m3", "nomic-embed-text", "paraphrase-multilingual"]}, {"name": "filepath", "text": "/home/myuser/myfile.txt", "probmethod_embedding": "weighted_average", "model": ["bge-m3", "nomic-embed-text", "paraphrase-multilingual"]}]}'`
|
||||||
|
|
||||||
|
Only the json:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"name": "myfile.txt",
|
||||||
|
"probmethod": "weighted_average",
|
||||||
|
"searchdomain": "mysearchdomain",
|
||||||
|
"attributes": {
|
||||||
|
"mimetype": "text-plain"
|
||||||
|
},
|
||||||
|
"datapoints": [
|
||||||
|
{
|
||||||
|
"name": "text",
|
||||||
|
"text": "this is the full text",
|
||||||
|
"probmethod_embedding": "weighted_average",
|
||||||
|
"model": [
|
||||||
|
"bge-m3",
|
||||||
|
"nomic-embed-text",
|
||||||
|
"paraphrase-multilingual"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "filepath",
|
||||||
|
"text": "/home/myuser/myfile.txt",
|
||||||
|
"probmethod_embedding": "weighted_average",
|
||||||
|
"model": [
|
||||||
|
"bge-m3",
|
||||||
|
"nomic-embed-text",
|
||||||
|
"paraphrase-multilingual"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
### Evaluate query (i.e. "search"; that what you're here for)
|
||||||
|
`src/cli/bin/Debug/net8.0/cli -h $mysql_ip -p $mysql_port -U $mysql_username -P $mysql_password --entity --evaluate -o $ollama_URL -s $searchdomain_name -q $query_string [-n $max_results]`
|
||||||
|
|
||||||
|
Executes a search using the specified query string and outputs the results.
|
||||||
|
|
||||||
|
### List entities
|
||||||
|
`src/cli/bin/Debug/net8.0/cli -h $mysql_ip -p $mysql_port -U $mysql_username -P $mysql_password --entity --list -s $searchdomain_name`
|
||||||
|
|
||||||
|
Lists all entities in that domain (together with its attributes and datapoints and probmethod)
|
||||||
|
|
||||||
|
### Delete entity
|
||||||
|
`src/cli/bin/Debug/net8.0/cli -h $mysql_ip -p $mysql_port -U $mysql_username -P $mysql_password --entity --remove -s $searchdomain_name -n $entity_name`
|
||||||
|
|
||||||
|
Deletes the entity specified by `$entity_name`.
|
||||||
|
|
||||||
|
# Known issues
|
||||||
|
| Issue | Solution
|
||||||
|
| --- | ---
|
||||||
|
| Failed to load /usr/lib/dotnet/host/fxr/8.0.15/libhostfxr.so, error: /snap/core20/current/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/lib/dotnet/host/fxr/8.0.15/libhostfxr.so) | You likely installed dotnet via snap. Try using `/usr/bin/dotnet` instead of `dotnet`.
|
||||||
|
|
||||||
# To-do
|
# To-do
|
||||||
- Implement the api server (WSGI via gunicorn / falcon)
|
- Implement the api server
|
||||||
- Move the models to the db file and move functions into the corresponding classes. (Maybe if circular references can be avoided, move them back to the model file in the end?)
|
- Improve performance & latency (Create ready-to-go processes where each contain an n'th share of the entity cache, ready to perform a query. Prepare it after creating the entity cache.)
|
||||||
- Add database setup script?
|
- Write a Linux installer for the CLI tool
|
||||||
- Remove tables related to caching (It's not done on the sql server side anymore.)
|
- Make the API server a docker container
|
||||||
- Improve performance (Create ready-to-go processes where each contain an n'th share of the entity cache, ready to perform a query. Prepare it after creating the entity cache.)
|
- Maybe add a config such that one does not need to always specify the MySQL connection info
|
||||||
- Perhaps split the database code into a "read-only" library, optimized for query performance and caching, and a management library meant for updating the cache?
|
|
||||||
|
|
||||||
# Off-scope
|
# Future features
|
||||||
- Support for other database types
|
- Support for other database types (TSQL, SQLite)
|
||||||
|
|||||||
44
embeddingsearch.sln
Normal file
44
embeddingsearch.sln
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 17
|
||||||
|
VisualStudioVersion = 17.0.31903.59
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{6AA0A9E0-A361-4E86-BA02-D5F6779C6DEF}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "embeddingsearch", "src\embeddingsearch\embeddingsearch.csproj", "{67AA89C0-3630-4994-B4EE-FC86CFF407DB}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "server", "src\server\server.csproj", "{643CB1D1-02F6-4BCC-A1CC-6E403D78C442}"
|
||||||
|
EndProject
|
||||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "cli", "cli", "{BC4F3063-B921-4C4A-A7CE-11FAF5B73D50}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cli", "src\cli\cli.csproj", "{D61A2C50-B46C-42BA-B75D-E84D8FA28C29}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{67AA89C0-3630-4994-B4EE-FC86CFF407DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{67AA89C0-3630-4994-B4EE-FC86CFF407DB}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{67AA89C0-3630-4994-B4EE-FC86CFF407DB}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{67AA89C0-3630-4994-B4EE-FC86CFF407DB}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{643CB1D1-02F6-4BCC-A1CC-6E403D78C442}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{643CB1D1-02F6-4BCC-A1CC-6E403D78C442}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{643CB1D1-02F6-4BCC-A1CC-6E403D78C442}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{643CB1D1-02F6-4BCC-A1CC-6E403D78C442}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{D61A2C50-B46C-42BA-B75D-E84D8FA28C29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{D61A2C50-B46C-42BA-B75D-E84D8FA28C29}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{D61A2C50-B46C-42BA-B75D-E84D8FA28C29}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{D61A2C50-B46C-42BA-B75D-E84D8FA28C29}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(NestedProjects) = preSolution
|
||||||
|
{67AA89C0-3630-4994-B4EE-FC86CFF407DB} = {6AA0A9E0-A361-4E86-BA02-D5F6779C6DEF}
|
||||||
|
{643CB1D1-02F6-4BCC-A1CC-6E403D78C442} = {6AA0A9E0-A361-4E86-BA02-D5F6779C6DEF}
|
||||||
|
{BC4F3063-B921-4C4A-A7CE-11FAF5B73D50} = {6AA0A9E0-A361-4E86-BA02-D5F6779C6DEF}
|
||||||
|
{D61A2C50-B46C-42BA-B75D-E84D8FA28C29} = {BC4F3063-B921-4C4A-A7CE-11FAF5B73D50}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,53 +0,0 @@
|
|||||||
|
|
||||||
import falcon
|
|
||||||
import falcon.request
|
|
||||||
import db
|
|
||||||
import util
|
|
||||||
import configparser
|
|
||||||
|
|
||||||
CONFIG_APIKEYS = ["0eeb46b2-064c-11f0-b1e8-87363427365e", "1a4ec916-064c-11f0-ac90-ff442f509128"]
|
|
||||||
|
|
||||||
def key_check(req:falcon.Request) -> bool:
|
|
||||||
try:
|
|
||||||
key = req.params['key']
|
|
||||||
return key in CONFIG_APIKEYS
|
|
||||||
except:
|
|
||||||
return False
|
|
||||||
|
|
||||||
def key_denied(req:falcon.Request, resp:falcon.Response):
|
|
||||||
resp.status = 401
|
|
||||||
resp.media = {"error": "unauthorized", "reason": "Invalid api key or key not given. /path?key=yourkey"}
|
|
||||||
|
|
||||||
class SearchDomain:
|
|
||||||
def on_get(self, req:falcon.Request, resp:falcon.Response) -> None:
|
|
||||||
if not key_check(req): return key_denied(req, resp)
|
|
||||||
try:
|
|
||||||
verb = req.params['verb']
|
|
||||||
except:
|
|
||||||
verb = ""
|
|
||||||
match verb:
|
|
||||||
case "create": # e.g. http://127.0.0.1:8000/searchdomain?key=0eeb46b2-064c-11f0-b1e8-87363427365e&verb=create
|
|
||||||
resp.status = 200
|
|
||||||
resp.media = {"error": "not implemented yet", "reason": "give me a minute :3"}
|
|
||||||
case "update":
|
|
||||||
pass
|
|
||||||
case "list":
|
|
||||||
pass
|
|
||||||
case "get":
|
|
||||||
pass
|
|
||||||
case "delete" | "remove" | "rm":
|
|
||||||
pass
|
|
||||||
case _:
|
|
||||||
resp.status = 418
|
|
||||||
resp.media = {"error": "not implemented yet", "reason": "unknown verb"}
|
|
||||||
|
|
||||||
|
|
||||||
# !!! Start this server using: gunicorn apiserver:app !!!
|
|
||||||
|
|
||||||
app = falcon.App()
|
|
||||||
app.add_route('/searchdomain', SearchDomain())
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
170
src/cli/Options.cs
Normal file
170
src/cli/Options.cs
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
using CommandLine;
|
||||||
|
namespace cli;
|
||||||
|
|
||||||
|
public class OptionsCommand
|
||||||
|
{
|
||||||
|
[Option("database", Required = false, HelpText = "Do things related to the database")] // Create database / ensure it is set up correctly
|
||||||
|
public bool IsDatabase { get; set; }
|
||||||
|
|
||||||
|
[Option("searchdomain", Required = false, HelpText = "Execute CRUD on searchdomains")]
|
||||||
|
public bool IsSearchdomain { get; set; }
|
||||||
|
|
||||||
|
[Option("entity", Required = false, HelpText = "Execute CRUD on entities")]
|
||||||
|
public bool IsEntity { get; set; }
|
||||||
|
|
||||||
|
[Option('h', "host", Required = true, HelpText = "Host IP address (e.g. 192.168.0.75)")]
|
||||||
|
public required string IP { get; set; }
|
||||||
|
|
||||||
|
[Option('p', "port", Required = true, HelpText = "Host port (e.g. 3306)")]
|
||||||
|
public required int Port { get; set; }
|
||||||
|
|
||||||
|
[Option('U', "username", Required = true, HelpText = "Username for the MySQL database")]
|
||||||
|
public required string Username { get; set; }
|
||||||
|
|
||||||
|
[Option('P', "password", Required = true, HelpText = "Password for the MySQL database")]
|
||||||
|
public required string Password { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class OptionsDatabase : OptionsCommand
|
||||||
|
{
|
||||||
|
[Option("setup", Required = false, HelpText = "Ensure the database is set up correctly")]
|
||||||
|
public bool SetupDatabase { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public class OptionsSearchdomain : OptionsCommand
|
||||||
|
{
|
||||||
|
[Option("create", Required = false, HelpText = "Create a searchdomain")]
|
||||||
|
public bool IsCreate { get; set; }
|
||||||
|
|
||||||
|
[Option("list", Required = false, HelpText = "Lists the searchdomains")]
|
||||||
|
public bool IsList { get; set; }
|
||||||
|
|
||||||
|
[Option("update", Required = false, HelpText = "Update a searchdomain (settings, name)")]
|
||||||
|
public bool IsUpdate { get; set; }
|
||||||
|
|
||||||
|
[Option("delete", Required = false, HelpText = "Delete a searchdomain")]
|
||||||
|
public bool IsDelete { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public class OptionsSearchdomainCreate : OptionsSearchdomain
|
||||||
|
{
|
||||||
|
[Option('s', Required = true, HelpText = "Name of the searchdomain to create")]
|
||||||
|
public required string Searchdomain { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class OptionsSearchdomainList : OptionsSearchdomain
|
||||||
|
{
|
||||||
|
// The cleanest piece of code in this project
|
||||||
|
}
|
||||||
|
|
||||||
|
public class OptionsSearchdomainUpdate : OptionsSearchdomain
|
||||||
|
{
|
||||||
|
[Option('s', Required = true, HelpText = "Name of the searchdomain to update")]
|
||||||
|
public required string Searchdomain { get; set; }
|
||||||
|
|
||||||
|
[Option('n', Required = false, HelpText = "New name to set")]
|
||||||
|
public string? Name { get; set; }
|
||||||
|
|
||||||
|
[Option('S', Required = false, HelpText = "New Settings (as json)")]
|
||||||
|
public string? Settings { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class OptionsSearchdomainDelete : OptionsSearchdomain
|
||||||
|
{
|
||||||
|
[Option('s', Required = true, HelpText = "Name of the searchdomain to delete")]
|
||||||
|
public required string Searchdomain { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public class OptionsEntity : OptionsCommand
|
||||||
|
{
|
||||||
|
[Option("evaluate", Required = false, HelpText = "Evaluate a query")]
|
||||||
|
public bool IsEvaluate { get; set; }
|
||||||
|
|
||||||
|
[Option("index", Required = false, HelpText = "Create or update an entity from a JSON string")]
|
||||||
|
public bool IsIndex { get; set; }
|
||||||
|
|
||||||
|
[Option("remove", Required = false, HelpText = "Remove an entity")]
|
||||||
|
public bool IsDelete { get; set; }
|
||||||
|
|
||||||
|
[Option("list", Required = false, HelpText = "List all entities")]
|
||||||
|
public bool IsList { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class OptionsEntityEvaluate : OptionsEntity
|
||||||
|
{
|
||||||
|
[Option('s', Required = true, HelpText = "Searchdomain to be searched")]
|
||||||
|
public required string Searchdomain { get; set; }
|
||||||
|
|
||||||
|
[Option('q', "query", Required = true, HelpText = "Query string to evaluate the entities against")]
|
||||||
|
public required string Query { get; set; }
|
||||||
|
|
||||||
|
[Option('o', "ollama", Required = true, HelpText = "Ollama URL")]
|
||||||
|
public required string OllamaURL { get; set; }
|
||||||
|
|
||||||
|
[Option('n', "num", Required = false, HelpText = "(Maximum) number of results to output", Default = 5)]
|
||||||
|
public int Num { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class OptionsEntityIndex : OptionsEntity // Example: -i -e {"name": "myfile.txt", "probmethod": "weighted_average", "searchdomain": "mysearchdomain", "attributes": {"mimetype": "text-plain"}, "datapoints": [{"name": "text", "text": "this is the full text", "probmethod_embedding": "weighted_average", "model": ["bge-m3", "nomic-embed-text", "paraphrase-multilingual"]}, {"name": "filepath", "text": "/home/myuser/myfile.txt", "probmethod_embedding": "weighted_average", "model": ["bge-m3", "nomic-embed-text", "paraphrase-multilingual"]}]}
|
||||||
|
{
|
||||||
|
[Option('s', Required = true, HelpText = "Searchdomain the entity belongs to")]
|
||||||
|
public required string Searchdomain { get; set; }
|
||||||
|
|
||||||
|
[Option('e', Required = true, HelpText = "Entity (as JSON) to be inserted")]
|
||||||
|
public required string EntityJSON { get; set; }
|
||||||
|
/* Example for an entity:
|
||||||
|
{
|
||||||
|
"name": "myfile.txt",
|
||||||
|
"probmethod": "weighted_average",
|
||||||
|
"searchdomain": "mysearchdomain",
|
||||||
|
"attributes": {
|
||||||
|
"mimetype": "text-plain"
|
||||||
|
},
|
||||||
|
"datapoints": [
|
||||||
|
{
|
||||||
|
"name": "text",
|
||||||
|
"text": "this is the full text",
|
||||||
|
"probmethod_embedding": "weighted_average",
|
||||||
|
"model": [
|
||||||
|
"bge-m3",
|
||||||
|
"nomic-embed-text",
|
||||||
|
"paraphrase-multilingual"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "filepath",
|
||||||
|
"text": "/home/myuser/myfile.txt",
|
||||||
|
"probmethod_embedding": "weighted_average",
|
||||||
|
"model": [
|
||||||
|
"bge-m3",
|
||||||
|
"nomic-embed-text",
|
||||||
|
"paraphrase-multilingual"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
[Option('o', "ollama", Required = true, HelpText = "Ollama URL")]
|
||||||
|
public required string OllamaURL { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class OptionsEntityRemove : OptionsEntity
|
||||||
|
{
|
||||||
|
[Option('s', Required = true, HelpText = "Searchdomain the entity belongs to")]
|
||||||
|
public required string Searchdomain { get; set; }
|
||||||
|
|
||||||
|
[Option('n', Required = true, HelpText = "Name of the entity")]
|
||||||
|
public required string Name { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class OptionsEntityList : OptionsEntity
|
||||||
|
{
|
||||||
|
[Option('s', Required = true, HelpText = "Searchdomain the entity belongs to")]
|
||||||
|
public required string Searchdomain { get; set; }
|
||||||
|
}
|
||||||
312
src/cli/Program.cs
Normal file
312
src/cli/Program.cs
Normal file
@@ -0,0 +1,312 @@
|
|||||||
|
using System.Drawing.Printing;
|
||||||
|
using embeddingsearch;
|
||||||
|
using Microsoft.Extensions.AI;
|
||||||
|
using OllamaSharp;
|
||||||
|
using OllamaSharp.Models;
|
||||||
|
using CommandLine;
|
||||||
|
using cli;
|
||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using Org.BouncyCastle.Asn1.X509.Qualified;
|
||||||
|
using Microsoft.Identity.Client;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
using System.Text.Json;
|
||||||
|
|
||||||
|
// ParserSettings parserSettings = new()
|
||||||
|
// {
|
||||||
|
// IgnoreUnknownArguments = true
|
||||||
|
// };
|
||||||
|
|
||||||
|
Parser parser = new(settings =>
|
||||||
|
{
|
||||||
|
settings.HelpWriter = Console.Error;
|
||||||
|
settings.IgnoreUnknownArguments = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
int retval = 0;
|
||||||
|
|
||||||
|
parser.ParseArguments<OptionsCommand>(args).WithParsed<OptionsCommand>(opts =>
|
||||||
|
{
|
||||||
|
if (opts.IsDatabase)
|
||||||
|
{
|
||||||
|
parser.ParseArguments<OptionsDatabase>(args).WithParsed<OptionsDatabase>(opts =>
|
||||||
|
{
|
||||||
|
Searchdomain searchdomain = GetSearchdomain("http://localhost", "", opts.IP, opts.Username, opts.Password, true); // http://localhost is merely a placeholder.
|
||||||
|
|
||||||
|
Dictionary<string, dynamic> parameters = [];
|
||||||
|
System.Data.Common.DbDataReader reader = searchdomain.ExecuteSQLCommand("show tables", parameters);
|
||||||
|
bool hasTables = reader.Read();
|
||||||
|
if (!hasTables)
|
||||||
|
{
|
||||||
|
reader.Close();
|
||||||
|
Console.WriteLine("Your database has no tables.");
|
||||||
|
if (opts.SetupDatabase)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Setting up tables.");
|
||||||
|
searchdomain.ExecuteSQLNonQuery("CREATE TABLE searchdomain (id int PRIMARY KEY auto_increment, name varchar(512), settings JSON);", parameters);
|
||||||
|
searchdomain.ExecuteSQLNonQuery("CREATE TABLE entity (id int PRIMARY KEY auto_increment, name varchar(512), probmethod varchar(128), id_searchdomain int, FOREIGN KEY (id_searchdomain) REFERENCES searchdomain(id));", parameters);
|
||||||
|
searchdomain.ExecuteSQLNonQuery("CREATE TABLE attribute (id int PRIMARY KEY auto_increment, id_entity int, attribute varchar(512), value longtext, FOREIGN KEY (id_entity) REFERENCES entity(id));", parameters);
|
||||||
|
searchdomain.ExecuteSQLNonQuery("CREATE TABLE datapoint (id int PRIMARY KEY auto_increment, name varchar(512), probmethod_embedding varchar(512), id_entity int, FOREIGN KEY (id_entity) REFERENCES entity(id));", parameters);
|
||||||
|
searchdomain.ExecuteSQLNonQuery("CREATE TABLE embedding (id int PRIMARY KEY auto_increment, id_datapoint int, model varchar(512), embedding blob, FOREIGN KEY (id_datapoint) REFERENCES datapoint(id));", parameters);
|
||||||
|
Console.WriteLine("Your database is ready to use.");
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
Console.WriteLine("Add the parameter `--setup` if you want the tables to be created for you.");
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
List<string> tables = ["attribute", "datapoint", "embedding", "entity", "searchdomain"];
|
||||||
|
Console.WriteLine("Your database is read-accessible and has the following tables:");
|
||||||
|
while (hasTables)
|
||||||
|
{
|
||||||
|
string table = reader.GetString(0);
|
||||||
|
Console.WriteLine($" - {table}");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
tables.Remove(table);
|
||||||
|
} catch (Exception) {}
|
||||||
|
hasTables = reader.Read();
|
||||||
|
}
|
||||||
|
if (tables.Count == 0)
|
||||||
|
{
|
||||||
|
Console.WriteLine("It looks like all necessary tables are there.");
|
||||||
|
}
|
||||||
|
Console.WriteLine("There is no check in place (yet) as to whether each table is formatted correctly and the data is consistent. Also this does not test write access. Good luck.");
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.WithNotParsed<OptionsDatabase>(action =>
|
||||||
|
{
|
||||||
|
PrintErrorMissingParameters("database");
|
||||||
|
retval = 1;
|
||||||
|
});
|
||||||
|
} else if (opts.IsSearchdomain)
|
||||||
|
{
|
||||||
|
parser.ParseArguments<OptionsSearchdomain>(args).WithParsed<OptionsSearchdomain>(opts =>
|
||||||
|
{
|
||||||
|
if (opts.IsCreate)
|
||||||
|
{
|
||||||
|
parser.ParseArguments<OptionsSearchdomainCreate>(args).WithParsed<OptionsSearchdomainCreate>(opts =>
|
||||||
|
{
|
||||||
|
Searchdomain searchdomain = GetSearchdomain("http://localhost", "", opts.IP, opts.Username, opts.Password, true); // http://localhost is merely a placeholder. // TODO implement a cleaner workaround
|
||||||
|
int id = searchdomain.DatabaseInsertSearchdomain(opts.Searchdomain);
|
||||||
|
Console.WriteLine($"The searchdomain was created under the following ID: {id}");
|
||||||
|
})
|
||||||
|
.WithNotParsed<OptionsSearchdomainCreate>(action =>
|
||||||
|
{
|
||||||
|
PrintErrorMissingParameters("searchdomain --create");
|
||||||
|
retval = 1;
|
||||||
|
});
|
||||||
|
} else if (opts.IsList)
|
||||||
|
{
|
||||||
|
parser.ParseArguments<OptionsSearchdomainList>(args).WithParsed<OptionsSearchdomainList>(opts =>
|
||||||
|
{
|
||||||
|
Searchdomain searchdomain = GetSearchdomain("http://localhost", "", opts.IP, opts.Username, opts.Password, true);
|
||||||
|
System.Data.Common.DbDataReader search = searchdomain.ExecuteSQLCommand("SELECT name FROM searchdomain", []);
|
||||||
|
Console.WriteLine("Searchdomains:");
|
||||||
|
while (search.Read())
|
||||||
|
{
|
||||||
|
Console.WriteLine($" - {search.GetString(0)}");
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.WithNotParsed<OptionsSearchdomainList>(action =>
|
||||||
|
{
|
||||||
|
PrintErrorMissingParameters("searchdomain --list");
|
||||||
|
retval = 1;
|
||||||
|
});
|
||||||
|
} else if (opts.IsUpdate)
|
||||||
|
{
|
||||||
|
parser.ParseArguments<OptionsSearchdomainUpdate>(args).WithParsed<OptionsSearchdomainUpdate>(opts =>
|
||||||
|
{
|
||||||
|
if (opts.Name is null && opts.Settings is null)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Warning: You did not specify either a new name or new settings. This will run, but with no effects."); // TODO add settings so this actually does not have any effect
|
||||||
|
}
|
||||||
|
Searchdomain searchdomainDry = GetSearchdomain("http://localhost:11434", "", opts.IP, opts.Username, opts.Password, true);
|
||||||
|
var search = searchdomainDry.ExecuteSQLCommand("SELECT * FROM searchdomain where name = @name", new() {{"name", opts.Searchdomain}});
|
||||||
|
bool hasSearchdomain = search.Read();
|
||||||
|
search.Close();
|
||||||
|
if (hasSearchdomain)
|
||||||
|
{
|
||||||
|
Searchdomain searchdomain = GetSearchdomain("http://localhost:11434", opts.Searchdomain, opts.IP, opts.Username, opts.Password);
|
||||||
|
Dictionary<string, dynamic> parameters = new()
|
||||||
|
{
|
||||||
|
{"name", opts.Name ?? opts.Searchdomain},
|
||||||
|
{"settings", opts.Settings ?? "{}"}, // TODO add settings.
|
||||||
|
{"id", searchdomain.id}
|
||||||
|
};
|
||||||
|
searchdomain.ExecuteSQLNonQuery("UPDATE searchdomain set name = @name, settings = @settings WHERE id = @id", parameters);
|
||||||
|
Console.WriteLine("Updated the searchdomain.");
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
Console.WriteLine("No searchdomain under this name found.");
|
||||||
|
retval = 1;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.WithNotParsed<OptionsSearchdomainUpdate>(action =>
|
||||||
|
{
|
||||||
|
PrintErrorMissingParameters("searchdomain --list");
|
||||||
|
retval = 1;
|
||||||
|
});
|
||||||
|
} else if (opts.IsDelete)
|
||||||
|
{
|
||||||
|
parser.ParseArguments<OptionsSearchdomainDelete>(args).WithParsed<OptionsSearchdomainDelete>(opts =>
|
||||||
|
{
|
||||||
|
Searchdomain searchdomain = GetSearchdomain("http://localhost:11434", opts.Searchdomain, opts.IP, opts.Username, opts.Password);
|
||||||
|
int counter = 0;
|
||||||
|
foreach (Entity entity in searchdomain.entityCache)
|
||||||
|
{
|
||||||
|
searchdomain.DatabaseRemoveEntity(entity.name);
|
||||||
|
counter += 1;
|
||||||
|
}
|
||||||
|
Console.WriteLine($"Number of entities deleted as part of deleting the searchdomain: {counter}");
|
||||||
|
searchdomain.ExecuteSQLNonQuery("DELETE FROM searchdomain WHERE name = @name", new() {{"name", opts.Searchdomain}});
|
||||||
|
Console.WriteLine("Searchdomain has been successfully removed.");
|
||||||
|
})
|
||||||
|
.WithNotParsed<OptionsSearchdomainDelete>(action =>
|
||||||
|
{
|
||||||
|
PrintErrorMissingParameters("searchdomain --list");
|
||||||
|
retval = 1;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.WithNotParsed<OptionsSearchdomain>(action =>
|
||||||
|
{
|
||||||
|
PrintErrorMissingParameters("searchdomain");
|
||||||
|
retval = 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
} else if (opts.IsEntity)
|
||||||
|
{
|
||||||
|
parser.ParseArguments<OptionsEntity>(args).WithParsed<OptionsEntity>(opts =>
|
||||||
|
{
|
||||||
|
if (opts.IsEvaluate)
|
||||||
|
{
|
||||||
|
parser.ParseArguments<OptionsEntityEvaluate>(args).WithParsed<OptionsEntityEvaluate>(opts =>
|
||||||
|
{
|
||||||
|
Console.WriteLine("The results:");
|
||||||
|
var search = Search(opts);
|
||||||
|
int max = opts.Num;
|
||||||
|
if (max > search.Count)
|
||||||
|
{
|
||||||
|
max = search.Count;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < max; i++)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"{search[i].Item1} {search[i].Item2}");
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.WithNotParsed<OptionsEntityEvaluate>(action =>
|
||||||
|
{
|
||||||
|
PrintErrorUndeterminedAction("entity");
|
||||||
|
retval = 1;
|
||||||
|
});
|
||||||
|
} else if (opts.IsIndex)
|
||||||
|
{
|
||||||
|
parser.ParseArguments<OptionsEntityIndex>(args).WithParsed<OptionsEntityIndex>(opts =>
|
||||||
|
{
|
||||||
|
Searchdomain searchdomain = GetSearchdomain(opts.OllamaURL, opts.Searchdomain, opts.IP, opts.Username, opts.Password);
|
||||||
|
Entity? entity = searchdomain.EntityFromJSON(opts.EntityJSON);
|
||||||
|
if (entity is not null)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Successfully created/updated the entity");
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
Console.Error.WriteLine("Unable to create the entity using the provided JSON.");
|
||||||
|
retval = 1;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.WithNotParsed<OptionsEntityIndex>(action =>
|
||||||
|
{
|
||||||
|
PrintErrorMissingParameters("entity --index");
|
||||||
|
retval = 1;
|
||||||
|
});
|
||||||
|
} else if (opts.IsDelete)
|
||||||
|
{
|
||||||
|
parser.ParseArguments<OptionsEntityRemove>(args).WithParsed<OptionsEntityRemove>(opts =>
|
||||||
|
{
|
||||||
|
Searchdomain searchdomain = GetSearchdomain("http://localhost:11434", opts.Searchdomain, opts.IP, opts.Username, opts.Password);
|
||||||
|
bool hasEntity = searchdomain.HasEntity(opts.Name);
|
||||||
|
if (hasEntity)
|
||||||
|
{
|
||||||
|
searchdomain.DatabaseRemoveEntity(opts.Name);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
Console.Error.WriteLine($"No entity with the name {opts.Name} has been found.");
|
||||||
|
retval = 1;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.WithNotParsed<OptionsEntityRemove>(action =>
|
||||||
|
{
|
||||||
|
PrintErrorMissingParameters("entity --remove");
|
||||||
|
retval = 1;
|
||||||
|
});
|
||||||
|
} else if (opts.IsList)
|
||||||
|
{
|
||||||
|
parser.ParseArguments<OptionsEntityList>(args).WithParsed<OptionsEntityList>(opts =>
|
||||||
|
{
|
||||||
|
Searchdomain searchdomain = GetSearchdomain("http://localhost:11434", opts.Searchdomain, opts.IP, opts.Username, opts.Password);
|
||||||
|
Console.WriteLine("Entities:");
|
||||||
|
foreach (Entity entity in searchdomain.entityCache)
|
||||||
|
{
|
||||||
|
Dictionary<string, string> datapointNames = [];
|
||||||
|
foreach (Datapoint datapoint in entity.datapoints)
|
||||||
|
{
|
||||||
|
datapointNames[datapoint.name] = datapoint.probMethod.Method.Name;
|
||||||
|
}
|
||||||
|
Console.WriteLine($"- {entity.name} | {JsonSerializer.Serialize(entity.attributes)} | {JsonSerializer.Serialize(datapointNames)}");
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.WithNotParsed<OptionsEntityList>(action =>
|
||||||
|
{
|
||||||
|
PrintErrorMissingParameters("entity --list");
|
||||||
|
retval = 1;
|
||||||
|
});
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
PrintErrorUndeterminedAction("entity");
|
||||||
|
retval = 1;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
Console.Error.WriteLine($"Unable to parse {args[0]}. Needs to be \"database\", \"searchdomain\", or \"entity\".");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
static List<(float, string)> Search(OptionsEntityEvaluate optionsEntityIndex)
|
||||||
|
{
|
||||||
|
var searchdomain = GetSearchdomain(optionsEntityIndex.OllamaURL, optionsEntityIndex.Searchdomain, optionsEntityIndex.IP, optionsEntityIndex.Username, optionsEntityIndex.Password);
|
||||||
|
List<(float, string)> results = searchdomain.Search(optionsEntityIndex.Query);
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static Searchdomain GetSearchdomain(string ollamaURL, string searchdomain, string ip, string username, string password, bool runEmpty = false)
|
||||||
|
{
|
||||||
|
string connectionString = $"server={ip};database=embeddingsearch;uid={username};pwd={password};";
|
||||||
|
var ollamaConfig = new OllamaApiClient.Configuration
|
||||||
|
{
|
||||||
|
Uri = new Uri(ollamaURL)
|
||||||
|
};
|
||||||
|
var ollama = new OllamaApiClient(ollamaConfig);
|
||||||
|
return new Searchdomain(searchdomain, connectionString, ollama, "sqlserver", runEmpty);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void PrintErrorUndeterminedAction(string prefix)
|
||||||
|
{
|
||||||
|
PrintErrorReferToHelp("Unable to determine an action", prefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void PrintErrorMissingParameters(string prefix)
|
||||||
|
{
|
||||||
|
PrintErrorReferToHelp("Not all required parameters were specified", prefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void PrintErrorReferToHelp(string text, string prefix) // TODO make this not static and set retval to not zero
|
||||||
|
{
|
||||||
|
Console.Error.WriteLine($"{text}. Please use `{prefix} --help` for more info");
|
||||||
|
}
|
||||||
19
src/cli/cli.csproj
Normal file
19
src/cli/cli.csproj
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="commandlineparser">
|
||||||
|
<Version>2.9.1</Version>
|
||||||
|
</PackageReference>
|
||||||
|
<PackageReference Include="OllamaSharp">
|
||||||
|
<Version>5.1.13</Version>
|
||||||
|
</PackageReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\embeddingsearch\embeddingsearch.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
357
src/db.py
357
src/db.py
@@ -1,357 +0,0 @@
|
|||||||
import mysql.connector # use pip install and not apt!
|
|
||||||
import util
|
|
||||||
import models
|
|
||||||
import json
|
|
||||||
import time
|
|
||||||
import pickle
|
|
||||||
from multiprocessing import Pool
|
|
||||||
from multiprocessing import Manager
|
|
||||||
from functools import partial
|
|
||||||
import multiprocessing as mp
|
|
||||||
import numpy as np
|
|
||||||
import datetime
|
|
||||||
|
|
||||||
def search_embeddings(datapoint:models.Datapoint, text:str, embeddings):
|
|
||||||
similarity_embeddings = []
|
|
||||||
for datapoint_embedding in datapoint.embeddings:
|
|
||||||
try:
|
|
||||||
embedding = embeddings[datapoint_embedding.model]
|
|
||||||
except:
|
|
||||||
embedding = datapoint.embeddingHandler.create_specific(datapoint_embedding.model, text)
|
|
||||||
embeddings[datapoint_embedding.model] = embedding
|
|
||||||
datapoint_embedding_unpacked = datapoint.embeddingHandler.embeddings_unpack(datapoint_embedding.embedding)
|
|
||||||
similarity_embeddings.append(datapoint.embeddingHandler.similarity(embedding, datapoint_embedding_unpacked))
|
|
||||||
return similarity_embeddings
|
|
||||||
|
|
||||||
def search_entity(entity:models.Entity, probmethods, text, embeddings):
|
|
||||||
similarity_datapoints = []
|
|
||||||
for datapoint in entity.datapoints:
|
|
||||||
similarity_embeddings = search_embeddings(datapoint, text, embeddings)
|
|
||||||
similarity_datapoint = probmethods.methods[datapoint.probmethod](similarity_embeddings)
|
|
||||||
similarity_datapoints.append(similarity_datapoint)
|
|
||||||
return [probmethods.methods[entity.probmethod](similarity_datapoints), entity.name]#entity]
|
|
||||||
|
|
||||||
def search_entities(entities:list[models.Entity], probmethods, text, embeddings, outqueue:mp.Queue):
|
|
||||||
for entity in entities:
|
|
||||||
outqueue.put(search_entity(entity, probmethods, text, embeddings))
|
|
||||||
return True
|
|
||||||
|
|
||||||
class connection:
|
|
||||||
connection:mysql.connector
|
|
||||||
probmethods:models.Probmethods
|
|
||||||
|
|
||||||
def __init__(self, host, user, password, database, probmethods:models.Probmethods):
|
|
||||||
self.connection = mysql.connector.connect(
|
|
||||||
host=host,
|
|
||||||
user=user,
|
|
||||||
password=password,
|
|
||||||
database=database
|
|
||||||
)
|
|
||||||
self.probmethods = probmethods
|
|
||||||
|
|
||||||
def __execute_get_id(self, query, params:tuple):
|
|
||||||
cursor = self.connection.cursor()
|
|
||||||
cursor.execute(query, params)
|
|
||||||
id = cursor.lastrowid
|
|
||||||
self.connection.commit()
|
|
||||||
return id
|
|
||||||
|
|
||||||
def __execute_get_rowsaffected(self, query, params):
|
|
||||||
cursor = self.connection.cursor()
|
|
||||||
cursor.execute(query, params)
|
|
||||||
cursor.commit()
|
|
||||||
return cursor.rowcount
|
|
||||||
|
|
||||||
def __execute_get_all(self, query, params):
|
|
||||||
cursor = self.connection.cursor()
|
|
||||||
cursor.execute(query, params)
|
|
||||||
return cursor.fetchall()
|
|
||||||
|
|
||||||
def __entity_get_conditional(self, condition_entity:str, condition_params:tuple, searchdomain:models.Searchdomain, name:str=None) -> list[models.Entity]:
|
|
||||||
if not searchdomain.entity_cache_invalid:
|
|
||||||
if name != None:
|
|
||||||
for entity in searchdomain.entity_cache:
|
|
||||||
if entity.name == name:
|
|
||||||
return [entity]
|
|
||||||
else:
|
|
||||||
return searchdomain.entity_cache
|
|
||||||
|
|
||||||
embedding = self.__execute_get_all(f"SELECT id, id_datapoint, model, embedding FROM embedding", ())
|
|
||||||
datapoint = self.__execute_get_all(f"SELECT id, id_entity, name, probmethod_embedding FROM datapoint", ())
|
|
||||||
attribute = self.__execute_get_all(f"SELECT id, id_entity, attribute, value FROM attribute", ())
|
|
||||||
entity = self.__execute_get_all(f"SELECT id, name, probmethod FROM entity WHERE {condition_entity}", (condition_params)) # TODO BUG parameterize the condition!
|
|
||||||
|
|
||||||
embedding_unassigned = {}
|
|
||||||
for embedding_ in embedding: # (id, id_datapoint, model, embedding)
|
|
||||||
embedding_id = embedding_[0]
|
|
||||||
embedding_id_datapoint = embedding_[1]
|
|
||||||
embedding_model = embedding_[2]
|
|
||||||
embedding_embedding = embedding_[3]
|
|
||||||
to_be_inserted = models.Embedding(embedding_id, embedding_model, embedding_embedding, embedding_id_datapoint) # TODO this "to_be_inserted" logic is pretty duplicate. Add method to handle this instead
|
|
||||||
try:
|
|
||||||
embedding_unassigned[embedding_id_datapoint].append(to_be_inserted)
|
|
||||||
except:
|
|
||||||
embedding_unassigned[embedding_id_datapoint] = [to_be_inserted]
|
|
||||||
datapoint_unassigned = {}
|
|
||||||
for datapoint_ in datapoint: # (id, id_entity, name, probmethod_embedding)
|
|
||||||
datapoint_id = datapoint_[0]
|
|
||||||
datapoint_id_entity = datapoint_[1]
|
|
||||||
datapoint_name = datapoint_[2]
|
|
||||||
datapoint_probmethod_embedding = datapoint_[3]
|
|
||||||
to_be_inserted = models.Datapoint(datapoint_id, datapoint_name, datapoint_probmethod_embedding, None, searchdomain.default_embeddinghandler)
|
|
||||||
try:
|
|
||||||
datapoint_unassigned[datapoint_id_entity].append(to_be_inserted) # BUG EmbeddingHandler not set when importing from DB. What do?
|
|
||||||
except:
|
|
||||||
datapoint_unassigned[datapoint_id_entity] = [to_be_inserted] # BUG EmbeddingHandler not set when importing from DB. What do?
|
|
||||||
try:
|
|
||||||
embedding_assigned = embedding_unassigned.pop(datapoint_id)
|
|
||||||
for embedding_ in embedding_assigned:
|
|
||||||
to_be_inserted.embeddings.append(embedding_)
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
attribute_unassigned = {}
|
|
||||||
for attribute_ in attribute: # (id, id_entity, attribute, value)
|
|
||||||
attribute_id = attribute_[0]
|
|
||||||
attribute_id_identity = attribute_[1]
|
|
||||||
attribute_attribute = attribute_[2]
|
|
||||||
attribute_value = attribute_[3]
|
|
||||||
to_be_inserted = models.Attribute(attribute_id, attribute_attribute, attribute_value)
|
|
||||||
try:
|
|
||||||
attribute_unassigned[attribute_id_identity].append(to_be_inserted)
|
|
||||||
except:
|
|
||||||
attribute_unassigned[attribute_id_identity] = [to_be_inserted]
|
|
||||||
entities = []
|
|
||||||
for entity_ in entity: # (id, name, probmethod)
|
|
||||||
entity_id = entity_[0]
|
|
||||||
entity_name = entity_[1]
|
|
||||||
entity_probmethod = entity_[2]
|
|
||||||
try:
|
|
||||||
properties = attribute_unassigned.pop(entity_id)
|
|
||||||
except:
|
|
||||||
properties = []
|
|
||||||
try:
|
|
||||||
datapoints = datapoint_unassigned.pop(entity_id)
|
|
||||||
except:
|
|
||||||
datapoints = []
|
|
||||||
entities.append(models.Entity(entity_id, entity_name, properties, datapoints, entity_probmethod, searchdomain))
|
|
||||||
embedding_unassigned = None # | Make sure no memory is hogged
|
|
||||||
datapoint_unassigned = None # |
|
|
||||||
attribute_unassigned = None # |
|
|
||||||
searchdomain.entity_cache = entities
|
|
||||||
searchdomain.entity_cache_invalid = False
|
|
||||||
return entities
|
|
||||||
|
|
||||||
def __datapoint_generate_embeddings(self, datapoint:models.Datapoint):
|
|
||||||
for model in datapoint.embeddingHandler.models:
|
|
||||||
embedding = datapoint.embeddingHandler.embeddings_pack(datapoint.embeddingHandler.create_specific(model, datapoint.text))
|
|
||||||
embedding_id = self.__execute_get_id("INSERT INTO embedding (id_datapoint, model, embedding) VALUES (%s, %s, %s)", (datapoint.id, model, embedding))
|
|
||||||
datapoint.embeddings.append(models.Embedding(embedding_id, model, embedding, datapoint.id))
|
|
||||||
|
|
||||||
def __datapoint_clear_embeddings(self, datapoint:models.Datapoint) -> bool:
|
|
||||||
return self.__execute_get_rowsaffected("DELETE FROM embedding WHERE id_datapoint=%s", (datapoint.id,)) > 0
|
|
||||||
|
|
||||||
def datapoint_update_embeddings(self, datapoint:models.Datapoint, text:str, clear_embeddings:bool):
|
|
||||||
# TODO test this
|
|
||||||
# TODO cache invalidation/revalidation - cache_revalidation_datapoint_update
|
|
||||||
if clear_embeddings:
|
|
||||||
self.__datapoint_clear_embeddings(datapoint)
|
|
||||||
datapoint.text = text
|
|
||||||
self.__datapoint_generate_embeddings(datapoint)
|
|
||||||
|
|
||||||
def entity_insert(self, name, probmethod, attributes:dict, datapoints:list[models.Datapoint], searchdomain:models.Searchdomain, embeddingHandler:util.EmbeddingHandler) -> models.Entity:
|
|
||||||
# TODO Test this
|
|
||||||
# TODO cache invalidation/revalidation
|
|
||||||
searchdomain.entity_cache_invalid = True
|
|
||||||
if len(self.__execute_get_all("SELECT * FROM entity WHERE name=%s AND id_searchdomain=%s", (name, searchdomain.id))):
|
|
||||||
entity = self.entity_get_by_name(name, searchdomain)[0]
|
|
||||||
self.entity_delete(entity)
|
|
||||||
attributes_ = []
|
|
||||||
id_entity = self.__execute_get_id("INSERT INTO entity (name, probmethod, id_searchdomain) VALUES (%s, %s, %s)", (name, probmethod, searchdomain.id))
|
|
||||||
for attribute, value in attributes.items():
|
|
||||||
attribute_id = self.__execute_get_id("INSERT INTO attribute (id_entity, attribute, value) VALUES (%s, %s, %s)", (id_entity, attribute, value))
|
|
||||||
attributes_.append(models.Attribute(attribute_id, attribute, value))
|
|
||||||
|
|
||||||
for datapoint in datapoints:
|
|
||||||
datapoint_name = datapoint.name
|
|
||||||
datapoint_probmethod = datapoint.probmethod
|
|
||||||
datapoint.parent_entity = id_entity # for good measure
|
|
||||||
datapoint_id = self.__execute_get_id("INSERT INTO datapoint (name, probmethod_embedding, id_entity) VALUES (%s, %s, %s)", (datapoint_name, datapoint_probmethod, id_entity))
|
|
||||||
datapoint.id = datapoint_id
|
|
||||||
self.datapoint_update_embeddings(datapoint, datapoint.text, False)
|
|
||||||
|
|
||||||
return models.Entity(id_entity, name, attributes_, datapoints, probmethod, searchdomain)
|
|
||||||
|
|
||||||
def entity_insert_datapoint(self, name:str, probmethod:str, text:str, entity:models.Entity, embeddinghandler:util.EmbeddingHandler) -> models.Datapoint:
|
|
||||||
# TODO test this
|
|
||||||
# TODO cache invalidation/revalidation - cache_revalidation_datapoint_create
|
|
||||||
entity.searchdomain.entity_cache_invalid = True
|
|
||||||
datapoint_id = self.__execute_get_id("INSERT INTO datapoint (name, probmethod_embedding, id_entity) VALUES (%s, %s, %s)", (name, probmethod, entity.id))
|
|
||||||
datapoint = models.Datapoint(datapoint_id, name, probmethod, text, embeddinghandler)
|
|
||||||
self.datapoint_update_embeddings(datapoint, text, False)
|
|
||||||
|
|
||||||
def entity_delete(self, entity:models.Entity, searchdomain:models.Searchdomain):
|
|
||||||
# TODO test this
|
|
||||||
searchdomain.entity_cache_invalid = True
|
|
||||||
for datapoint in entity.datapoints:
|
|
||||||
self.__execute_get_id("DELETE FROM embedding WHERE id_datapoint=%s", (datapoint.id,))
|
|
||||||
self.__execute_get_id("DELETE FROM datapoint WHERE id=%s", (datapoint.id,))
|
|
||||||
self.__execute_get_id("DELETE FROM attribute WHERE id_entity=%s", (entity.id,))
|
|
||||||
self.__execute_get_id("DELETE FROM entity WHERE id=%s", (entity.id,))
|
|
||||||
# TODO query cache invalidation/revalidation
|
|
||||||
|
|
||||||
def entity_update_attribute(self, entity:models.Entity, attribute:str, value:str, create_if_not_exists=True) -> bool:
|
|
||||||
# TODO test this
|
|
||||||
rowsaffected = self.__execute_get_rowsaffected("UPDATE attribute SET value=%s WHERE name=%s", (value, attribute))
|
|
||||||
if create_if_not_exists and rowsaffected <= 0:
|
|
||||||
self.__execute_get_id("INSERT INTO attribute (id_identity, attribute, value) VALUES (%s, %s, %s)", (entity.id, attribute, value))
|
|
||||||
return True
|
|
||||||
elif not create_if_not_exists and rowsaffected <= 0:
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
def entity_update_datapoint_name(self, datapoint:models.Datapoint, new_datapoint_name:str) -> bool:
|
|
||||||
# TODO test this
|
|
||||||
rowsaffected = self.__execute_get_rowsaffected("UPDATE datapoint SET name=%s WHERE id=%s", (new_datapoint_name, datapoint.id))
|
|
||||||
return rowsaffected > 0
|
|
||||||
|
|
||||||
def entity_update_datapoint_probmethod(self, datapoint:models.Datapoint, new_probmethod:str, searchdomain:models.Searchdomain):
|
|
||||||
# TODO test this
|
|
||||||
searchdomain.entity_cache_invalid = True
|
|
||||||
# TODO cache invalidation/revalidation - cache_revalidation_datapoint_update
|
|
||||||
rowsaffected = self.__execute_get_rowsaffected("UPDATE datapoint SET probmethod=%s WHERE id=%s", (new_probmethod, datapoint.id))
|
|
||||||
return rowsaffected > 0
|
|
||||||
|
|
||||||
def entity_delete_attribute(self, entity:models.Entity, attribute_name:str) -> bool:
|
|
||||||
# TODO test this
|
|
||||||
return self.__execute_get_rowsaffected("DELETE FROM attribute WHERE id_entity=%s", (entity.id,)) > 0
|
|
||||||
|
|
||||||
def entity_delete_datapoint(self, datapoint:models.Datapoint) -> bool:
|
|
||||||
# TODO test this
|
|
||||||
# TODO cache invalidation/revalidation - cache_revalidation_datapoint_remove
|
|
||||||
self.__execute_get_rowsaffected("DELETE FROM embedding WHERE id_datapoint=%s", (datapoint.id,))
|
|
||||||
return self.__execute_get_rowsaffected("DELETE FROM datapoint WHERE id=%s", (datapoint.id,)) > 0
|
|
||||||
|
|
||||||
def entity_get_all(self, searchdomain:models.Searchdomain) -> list[models.Entity]:
|
|
||||||
return self.__entity_get_conditional("1 = 1", (), searchdomain)
|
|
||||||
|
|
||||||
def entity_get_by_name(self, name:str, searchdomain:models.Searchdomain) -> list[models.Entity]:
|
|
||||||
return self.__entity_get_conditional(f"name = %s", (name,), searchdomain) # TODO parameterize this
|
|
||||||
|
|
||||||
def searchdomain_create(self, name:str, settings:models.Searchdomain_settings, default_embeddinghandler:util.EmbeddingHandler) -> models.Searchdomain:
|
|
||||||
id_searchdomain = self.__execute_get_id("INSERT INTO searchdomain (name, settings) VALUES (%s, %s)", (name, settings.as_json()))
|
|
||||||
return models.Searchdomain(id_searchdomain, name, settings, default_embeddinghandler)
|
|
||||||
|
|
||||||
def searchdomain_get(self, name:str, default_embeddinghandler:util.EmbeddingHandler, create_if_not_exists:bool=True) -> models.Searchdomain:
|
|
||||||
searchdomain = self.__execute_get_all("SELECT id, name, settings FROM searchdomain WHERE name=%s", (name,))
|
|
||||||
if len(searchdomain) == 0 and create_if_not_exists:
|
|
||||||
self.searchdomain_create(name, models.Searchdomain_settings(), default_embeddinghandler)
|
|
||||||
return self.searchdomain_get(name, default_embeddinghandler)
|
|
||||||
return models.Searchdomain(searchdomain[0][0], searchdomain[0][1], models.Searchdomain_settings().from_json(searchdomain[0][2]), default_embeddinghandler)
|
|
||||||
|
|
||||||
def searchdomain_get_all(self, default_embeddinghandler:util.EmbeddingHandler) -> models.Searchdomain:
|
|
||||||
searchdomain = self.__execute_get_all("SELECT id, name, settings FROM searchdomain", ())
|
|
||||||
searchdomains = []
|
|
||||||
for searchdomain_ in searchdomain:
|
|
||||||
searchdomains.append(models.Searchdomain(searchdomain[0], searchdomain[1], models.Searchdomain_settings().from_json(searchdomain[2]), default_embeddinghandler))
|
|
||||||
return searchdomains
|
|
||||||
|
|
||||||
def searchdomain_delete(self, searchdomain:models.Searchdomain) -> bool:
|
|
||||||
# TODO test this
|
|
||||||
searchdomain = self.__execute_get_rowsaffected("DELETE FROM searchdomain WHERE id=%s", (searchdomain.id,))
|
|
||||||
return searchdomain > 0
|
|
||||||
|
|
||||||
def searchdomain_update_name(self, searchdomain:models.Searchdomain, new_name:str):
|
|
||||||
# TODO test this
|
|
||||||
searchdomain = self.__execute_get_rowsaffected("UPDATE searchdomain SET name=%s WHERE id=%s", (new_name, searchdomain.id))
|
|
||||||
return searchdomain > 0
|
|
||||||
|
|
||||||
def searchdomain_update_setting(self, searchdomain:models.Searchdomain, setting:str, value:any):
|
|
||||||
# TODO test this
|
|
||||||
searchdomain = self.__execute_get_rowsaffected("UPDATE searchdomain SET settings=JSON_SET(settings, '$.%s', %s) WHERE id=%s", (setting, value, searchdomain.id))
|
|
||||||
return searchdomain > 0
|
|
||||||
|
|
||||||
def searchdomain_search(self, searchdomain:models.Searchdomain, text:str, limit_results:int=None, multithreaded=True) -> list[float, str]:
|
|
||||||
if searchdomain.search_cache.__contains__(text):
|
|
||||||
searchresult:models.Searchresult = searchdomain.search_cache[text]
|
|
||||||
searchresult.last_access_date = datetime.datetime.now()
|
|
||||||
return searchresult.results
|
|
||||||
time1 = time.time()
|
|
||||||
entities = self.entity_get_all(searchdomain)
|
|
||||||
if multithreaded:
|
|
||||||
with Manager() as manager:
|
|
||||||
print("a")
|
|
||||||
print(time.time()-time1)
|
|
||||||
embeddings = manager.dict()#Value('d', {}) # Multiprocessing-safe
|
|
||||||
print("b")
|
|
||||||
print(time.time()-time1)
|
|
||||||
similarity_entities = []
|
|
||||||
print("c")
|
|
||||||
print(time.time()-time1)
|
|
||||||
cpu_count = mp.cpu_count()
|
|
||||||
print("d")
|
|
||||||
print(time.time()-time1)
|
|
||||||
outqueue = mp.Queue(len(entities))
|
|
||||||
print("e")
|
|
||||||
print(time.time()-time1)
|
|
||||||
entities_ = np.array_split(entities, cpu_count)
|
|
||||||
print("f")
|
|
||||||
print(time.time()-time1)
|
|
||||||
processes:list[mp.Process] = [None] * cpu_count
|
|
||||||
print("g")
|
|
||||||
print(time.time()-time1)
|
|
||||||
for i in range(cpu_count):
|
|
||||||
processes[i] = mp.Process(target=search_entities, args=(entities_[i], self.probmethods, text, embeddings, outqueue))
|
|
||||||
for process in processes:
|
|
||||||
process.start()
|
|
||||||
print("h")
|
|
||||||
print(time.time()-time1)
|
|
||||||
while len(similarity_entities) < len(entities):
|
|
||||||
if outqueue.qsize():
|
|
||||||
#print(f"got something from queue {outqueue.qsize()} - {len(similarity_entities)} - {len(entities_)}")
|
|
||||||
similarity_entities.append(outqueue.get())
|
|
||||||
else:
|
|
||||||
#print(processes[0].is_alive())
|
|
||||||
#print(outqueue.qsize())
|
|
||||||
pass#time.sleep(0.01)
|
|
||||||
print("i")
|
|
||||||
print(time.time()-time1)
|
|
||||||
for process in processes:
|
|
||||||
if process.is_alive():
|
|
||||||
process.join()
|
|
||||||
process.close()
|
|
||||||
print("j")
|
|
||||||
print(time.time()-time1)
|
|
||||||
print(outqueue.qsize())
|
|
||||||
outqueue.close()
|
|
||||||
#print(similarity_entities)
|
|
||||||
#with Pool() as pool:
|
|
||||||
# method = search_entity
|
|
||||||
# partial_search_entity = partial(method, probmethods=self.probmethods, text=text, embeddings=embeddings)
|
|
||||||
# time1 = time.time()
|
|
||||||
# similarity_entities = pool.map(partial_search_entity, entities)
|
|
||||||
# print(time.time() - time1)
|
|
||||||
# print(f"DEBUG@searchdomain_search - {len(pickle.dumps(entities))} - {len(pickle.dumps(self.probmethods))} - {len(pickle.dumps(text))} - {len(pickle.dumps(embeddings))} - {len(pickle.dumps(similarity_entities))}")
|
|
||||||
# # Entities is 24.6 MB, which is a lot, and it appears to take long to transfer.
|
|
||||||
# # Doing multithreading this way currently reduces the execution time from ~1200ms to ~800ms, so not much.
|
|
||||||
# #
|
|
||||||
# #similarity_entities = pool.map(self.__search_entity, entities)
|
|
||||||
else:
|
|
||||||
embeddings = {}
|
|
||||||
similarity_entities = []
|
|
||||||
for entity in entities:
|
|
||||||
similarity_datapoints = []
|
|
||||||
for datapoint in entity.datapoints:
|
|
||||||
similarity_embeddings = search_embeddings(datapoint, text, embeddings)
|
|
||||||
similarity_datapoint = self.probmethods.methods[datapoint.probmethod](similarity_embeddings)
|
|
||||||
similarity_datapoints.append(similarity_datapoint)
|
|
||||||
similarity_entities.append([self.probmethods.methods[entity.probmethod](similarity_datapoints), entity.name]) #entity])
|
|
||||||
print(time.time()-time1)
|
|
||||||
results = sorted(similarity_entities, key=lambda x: x[0], reverse=True)
|
|
||||||
print(time.time()-time1)
|
|
||||||
|
|
||||||
if len(searchdomain.search_cache) < searchdomain.settings.cache_maxentries:
|
|
||||||
searchdomain.search_cache[text] = models.Searchresult(text, datetime.datetime.now(), results)
|
|
||||||
|
|
||||||
if limit_results:
|
|
||||||
return results[:limit_results]
|
|
||||||
return results
|
|
||||||
104
src/dbtest.py
104
src/dbtest.py
@@ -1,104 +0,0 @@
|
|||||||
import ollama
|
|
||||||
import json
|
|
||||||
import db
|
|
||||||
import models
|
|
||||||
import util
|
|
||||||
import os
|
|
||||||
import numpy as np
|
|
||||||
import time
|
|
||||||
import pickle
|
|
||||||
|
|
||||||
def fact(x):
|
|
||||||
return 1/(1-x)
|
|
||||||
|
|
||||||
def wavg(arr):
|
|
||||||
if 1 in arr:
|
|
||||||
return 1
|
|
||||||
f = [fact(x) for x in arr]
|
|
||||||
fm = [x * fact(x) for x in arr]
|
|
||||||
return np.sum(fm) / np.sum(f)
|
|
||||||
|
|
||||||
|
|
||||||
probmethods = models.Probmethods({"weighted_average": wavg})
|
|
||||||
|
|
||||||
connection = db.connection("localhost", "embeddingsearch", "ohmyllama!420wip", "embeddingsearch", probmethods)
|
|
||||||
|
|
||||||
# TODO does the entity need embedding handler? Remove it if not necessary
|
|
||||||
|
|
||||||
|
|
||||||
MODELS = ["mxbai-embed-large", "bge-m3", "paraphrase-multilingual", "nomic-embed-text"]
|
|
||||||
#MODELS = ["nomic-embed-text", "bge-m3"]
|
|
||||||
|
|
||||||
|
|
||||||
client = util.PicklableOllamaClient("http://192.168.0.101:11434")
|
|
||||||
embedding_handler = util.EmbeddingHandler(MODELS, client)
|
|
||||||
#searchdomain_settings = models.Searchdomain_settings()
|
|
||||||
#searchdomain = connection.searchdomain_create("testtarget", searchdomain_settings)
|
|
||||||
searchdomain = connection.searchdomain_get("testtarget", embedding_handler)
|
|
||||||
|
|
||||||
def index_file(filepath, entities:list[models.Entity] = None) -> bool:
|
|
||||||
lastmodified = os.path.getmtime(filepath)
|
|
||||||
if entities == None:
|
|
||||||
previous_entity = connection.entity_get_by_name(filepath, searchdomain)
|
|
||||||
else:
|
|
||||||
previous_entity = [entity for entity in entities if entity.name == filepath]
|
|
||||||
if previous_entity:
|
|
||||||
previous_entity = previous_entity[0]
|
|
||||||
lastmodified_prev = previous_entity.get_attribute("lastmodified")
|
|
||||||
if lastmodified == float(lastmodified_prev.value):
|
|
||||||
return False
|
|
||||||
try:
|
|
||||||
with open(filepath, "r") as file:
|
|
||||||
text = file.read()
|
|
||||||
except:
|
|
||||||
return False
|
|
||||||
entity = connection.entity_insert(filepath, "weighted_average", {"path": filepath, "type": "file", "contents": "text", "lastmodified": lastmodified}, [], searchdomain, embedding_handler)
|
|
||||||
datapoint_filepath = connection.entity_insert_datapoint("filepath", "weighted_average", filepath, entity, embedding_handler)
|
|
||||||
datapoint_content = connection.entity_insert_datapoint("content", "weighted_average", text, entity, embedding_handler)
|
|
||||||
return True
|
|
||||||
|
|
||||||
def index_folder(path):
|
|
||||||
time_start = time.time()
|
|
||||||
entities = connection.entity_get_all(searchdomain)
|
|
||||||
filecount_total = 0
|
|
||||||
filecount_updated = 0
|
|
||||||
for root, _, files in os.walk(path):
|
|
||||||
for file in files:
|
|
||||||
# This can easily be multiprocessed.
|
|
||||||
# Push each filepath into a list of filepaths and then create a pool with it.
|
|
||||||
filepath = os.path.join(root, file)
|
|
||||||
retval = index_file(filepath, entities)
|
|
||||||
if retval:
|
|
||||||
filecount_updated += 1
|
|
||||||
filecount_total += 1
|
|
||||||
time_diff = time.time() - time_start
|
|
||||||
print(f"TIME@index_folder: {time_diff * 1000} ms - {filecount_total / time_diff} files per second - {filecount_updated} files updated")
|
|
||||||
|
|
||||||
def search(text):
|
|
||||||
time_start = time.time()
|
|
||||||
results = connection.searchdomain_search(searchdomain, text, multithreaded=True)
|
|
||||||
time_diff = time.time() - time_start
|
|
||||||
print("Results")
|
|
||||||
for i in range(10):
|
|
||||||
result = results[i]
|
|
||||||
result_certainty = result[0]
|
|
||||||
result_entity = result[1]
|
|
||||||
#print(f"Result {i}: {result_entity.name} {result_entity.attributes[0].value}")
|
|
||||||
print(f"Result {i}: {result_entity}")
|
|
||||||
#print(results)
|
|
||||||
print(f"TIME@search: {round(time_diff * 1000, 2)} ms at an entity count of {len(results)} resulting in {round(len(results) / time_diff, 2)} results per second")
|
|
||||||
print(f"Total entity cache size: {round(len(pickle.dumps(searchdomain.entity_cache)) / 1024 / 1024, 2)} MB")
|
|
||||||
print(f"Total search cache size: {round(len(pickle.dumps(searchdomain.search_cache)) / 1024 / 1024, 2)} MB with {len(searchdomain.search_cache)} entries = {round(len(pickle.dumps(searchdomain.search_cache)) / len(searchdomain.search_cache) / 1024, 2)} KB/entry")
|
|
||||||
|
|
||||||
while True:
|
|
||||||
verb = input("Please enter an action: index_folder to index a folder | index_file to index a single file | query or search to search for a text: ")
|
|
||||||
|
|
||||||
match verb:
|
|
||||||
case "index_folder":
|
|
||||||
index_folder(input("Please input the folder to index: "))
|
|
||||||
case "index_file":
|
|
||||||
index_file(input("Please input the file to index: "))
|
|
||||||
case "query" | "search":
|
|
||||||
search(input("Please input what you want to search for: "))
|
|
||||||
|
|
||||||
|
|
||||||
62
src/embeddingsearch/Datapoint.cs
Normal file
62
src/embeddingsearch/Datapoint.cs
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.Extensions.AI;
|
||||||
|
using OllamaSharp;
|
||||||
|
using OllamaSharp.Models;
|
||||||
|
|
||||||
|
namespace embeddingsearch;
|
||||||
|
|
||||||
|
public class Datapoint
|
||||||
|
{
|
||||||
|
public string name;
|
||||||
|
public Probmethods.probMethodDelegate probMethod;
|
||||||
|
public List<(string, float[])> embeddings;
|
||||||
|
|
||||||
|
public Datapoint(string name, Probmethods.probMethodDelegate probMethod, List<(string, float[])> embeddings)
|
||||||
|
{
|
||||||
|
this.name = name;
|
||||||
|
this.probMethod = probMethod;
|
||||||
|
this.embeddings = embeddings;
|
||||||
|
}
|
||||||
|
|
||||||
|
// public Datapoint(string name, Probmethods.probMethodDelegate probmethod, string content, List<string> models, OllamaApiClient ollama)
|
||||||
|
// {
|
||||||
|
// this.name = name;
|
||||||
|
// this.probMethod = probmethod;
|
||||||
|
// embeddings = GenerateEmbeddings(content, models, ollama);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// public float CalcProbability()
|
||||||
|
// {
|
||||||
|
// return probMethod(embeddings); // <--- prob method is not used with the embeddings!
|
||||||
|
// }
|
||||||
|
|
||||||
|
public float CalcProbability(List<(string, float)> probabilities)
|
||||||
|
{
|
||||||
|
return probMethod(probabilities);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Dictionary<string, float[]> GenerateEmbeddings(string content, List<string> models, OllamaApiClient ollama)
|
||||||
|
{
|
||||||
|
Dictionary<string, float[]> retVal = [];
|
||||||
|
foreach (string model in models)
|
||||||
|
{
|
||||||
|
EmbedRequest request = new()
|
||||||
|
{
|
||||||
|
Model = model,
|
||||||
|
Input = [content]
|
||||||
|
};
|
||||||
|
|
||||||
|
var response = ollama.GenerateEmbeddingAsync(content, new EmbeddingGenerationOptions(){ModelId=model}).Result;
|
||||||
|
if (response is not null)
|
||||||
|
{
|
||||||
|
float[] var = new float[response.Vector.Length];
|
||||||
|
response.Vector.CopyTo(var);
|
||||||
|
retVal[model] = var;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
}
|
||||||
12
src/embeddingsearch/Entity.cs
Normal file
12
src/embeddingsearch/Entity.cs
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace embeddingsearch;
|
||||||
|
|
||||||
|
public class Entity(Dictionary<string, string> attributes, Probmethods.probMethodDelegate probMethod, List<Datapoint> datapoints, string name)
|
||||||
|
{
|
||||||
|
public Dictionary<string, string> attributes = attributes;
|
||||||
|
public Probmethods.probMethodDelegate probMethod = probMethod;
|
||||||
|
public List<Datapoint> datapoints = datapoints;
|
||||||
|
public int id;
|
||||||
|
public string name = name;
|
||||||
|
}
|
||||||
16
src/embeddingsearch/JSONModels.cs
Normal file
16
src/embeddingsearch/JSONModels.cs
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
class JSONEntity
|
||||||
|
{
|
||||||
|
public required string name { get; set; }
|
||||||
|
public required string probmethod { get; set; }
|
||||||
|
public required string searchdomain { get; set; }
|
||||||
|
public required Dictionary<string, string> attributes { get; set; }
|
||||||
|
public required JSONDatapoint[] datapoints { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
class JSONDatapoint
|
||||||
|
{
|
||||||
|
public required string name { get; set; }
|
||||||
|
public required string text { get; set; }
|
||||||
|
public required string probmethod_embedding { get; set; }
|
||||||
|
public required string[] model { get; set; }
|
||||||
|
}
|
||||||
72
src/embeddingsearch/Probmethods.cs
Normal file
72
src/embeddingsearch/Probmethods.cs
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
|
||||||
|
|
||||||
|
using System.Numerics.Tensors;
|
||||||
|
|
||||||
|
namespace embeddingsearch;
|
||||||
|
|
||||||
|
|
||||||
|
public class Probmethods
|
||||||
|
{
|
||||||
|
public delegate float probMethodDelegate(List<(string, float)> list);
|
||||||
|
public Dictionary<string, probMethodDelegate> probMethods;
|
||||||
|
|
||||||
|
public Probmethods(Dictionary<string, probMethodDelegate> probMethods)
|
||||||
|
{
|
||||||
|
this.probMethods = probMethods;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Probmethods()
|
||||||
|
{
|
||||||
|
probMethods = [];
|
||||||
|
probMethods["wavg"] = WavgList;
|
||||||
|
probMethods["weighted_average"] = WavgList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public probMethodDelegate? GetMethod(string name)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return probMethods[name];
|
||||||
|
} catch (Exception)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float Fact(float x)
|
||||||
|
{
|
||||||
|
return 1 / (1 - x);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float WavgList(List<(string, float)> list)
|
||||||
|
{
|
||||||
|
float[] arr = new float[list.Count];
|
||||||
|
for (int i = 0; i < list.Count; i++)
|
||||||
|
{
|
||||||
|
arr[i] = list.ElementAt(i).Item2;
|
||||||
|
}
|
||||||
|
return Wavg(arr);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float Wavg(float[] arr)
|
||||||
|
{
|
||||||
|
if (arr.Contains(1))
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
float f = 0;
|
||||||
|
float fm = 0;
|
||||||
|
for (int i = 0; i < arr.Length; i++)
|
||||||
|
{
|
||||||
|
float x = arr[i];
|
||||||
|
f += Fact(x);
|
||||||
|
fm += x * Fact(x);
|
||||||
|
}
|
||||||
|
return f / fm;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float Similarity(float[] vector1, float[] vector2)
|
||||||
|
{
|
||||||
|
return (float) TensorPrimitives.CosineSimilarity(vector1, vector2);
|
||||||
|
}
|
||||||
|
}
|
||||||
408
src/embeddingsearch/Searchdomain.cs
Normal file
408
src/embeddingsearch/Searchdomain.cs
Normal file
@@ -0,0 +1,408 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Data;
|
||||||
|
using System.Data.Common;
|
||||||
|
//using System.Data.SqlClient;
|
||||||
|
//using Microsoft.Data.SqlClient;
|
||||||
|
using MySql.Data;
|
||||||
|
using MySql.Data.MySqlClient;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Npgsql;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using OllamaSharp;
|
||||||
|
using OllamaSharp.Models;
|
||||||
|
using System.Configuration;
|
||||||
|
using System.Data.SqlClient;
|
||||||
|
using Mysqlx.Resultset;
|
||||||
|
using System.Collections.Immutable;
|
||||||
|
using System.Text.Json;
|
||||||
|
using System.Numerics.Tensors;
|
||||||
|
|
||||||
|
namespace embeddingsearch;
|
||||||
|
|
||||||
|
public class Searchdomain
|
||||||
|
{
|
||||||
|
private readonly string _connectionString;
|
||||||
|
private readonly string _provider;
|
||||||
|
public OllamaApiClient ollama;
|
||||||
|
public Probmethods probmethods;
|
||||||
|
public string searchdomain;
|
||||||
|
public int id;
|
||||||
|
public Dictionary<string, List<(DateTime, List<(float, string)>)>> searchCache; // Yeah look at this abomination. searchCache[x][0] = last accessed time, searchCache[x][1] = results for x
|
||||||
|
public List<Entity> entityCache;
|
||||||
|
public List<string> modelsInUse;
|
||||||
|
public Dictionary<string, Dictionary<string, float[]>> embeddingCache;
|
||||||
|
public int embeddingCacheMaxSize = 10000000;
|
||||||
|
private readonly MySqlConnection connection;
|
||||||
|
|
||||||
|
// TODO Add settings and update cli/program.cs, as well as DatabaseInsertSearchdomain()
|
||||||
|
|
||||||
|
public Searchdomain(string searchdomain, string connectionString, OllamaApiClient ollama, string provider = "sqlserver", bool runEmpty = false)
|
||||||
|
{
|
||||||
|
_connectionString = connectionString;
|
||||||
|
_provider = provider.ToLower();
|
||||||
|
this.searchdomain = searchdomain;
|
||||||
|
this.ollama = ollama;
|
||||||
|
searchCache = [];
|
||||||
|
entityCache = [];
|
||||||
|
embeddingCache = [];
|
||||||
|
connection = new MySqlConnection(connectionString);
|
||||||
|
connection.Open();
|
||||||
|
probmethods = new();
|
||||||
|
modelsInUse = []; // To make the compiler shut up - it is set in UpdateSearchDomain() don't worry // yeah, about that...
|
||||||
|
if (!runEmpty)
|
||||||
|
{
|
||||||
|
GetID();
|
||||||
|
UpdateSearchDomain();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateSearchDomain()
|
||||||
|
{
|
||||||
|
Dictionary<string, dynamic> parametersIDSearchdomain = new()
|
||||||
|
{
|
||||||
|
["id"] = this.id
|
||||||
|
};
|
||||||
|
//(error) DbDataReader embeddingReader = ExecuteSQLCommand("SELECT id, id_datapoint, model, embedding FROM embedding JOIN datapoint on embedding.id as dp JOIN entity on dp.id_entity as en JOIN searchdomain on en.id_searchdomain as sd WHERE sd=@id", parametersIDSearchdomain);
|
||||||
|
//(produces endless amounts of data) DbDataReader embeddingReader = ExecuteSQLCommand("SELECT embedding.id, id_datapoint, model, embedding FROM embedding JOIN datapoint as dp on embedding.id JOIN entity as en on dp.id_entity JOIN searchdomain as sd on en.id_searchdomain WHERE sd.id=@id", parametersIDSearchdomain);
|
||||||
|
DbDataReader embeddingReader = ExecuteSQLCommand("SELECT embedding.id, id_datapoint, model, embedding FROM embedding", parametersIDSearchdomain);
|
||||||
|
//DbDataReader datapointReader = ExecuteSQLCommand("SELECT id, id_entity, name, probmethod_embedding FROM datapoint JOIN entity on Datapoint.id_entity as en JOIN searchdomain on en.id_searchdomain as sd WHERE sd=@id", parametersIDSearchdomain);
|
||||||
|
//DbDataReader attributeReader = ExecuteSQLCommand("SELECT id, id_entity, attribute, value FROM attribute JOIN entity on attribute.id_entity as en JOIN searchdomain on en.id_searchdomain as sd WHERE sd=@id", parametersIDSearchdomain);
|
||||||
|
//DbDataReader entityReader = ExecuteSQLCommand("SELECT id, name, probmethod FROM entity WHERE id_searchdomain=@id", parametersIDSearchdomain);
|
||||||
|
Dictionary<int, Dictionary<string, float[]>> embedding_unassigned = [];
|
||||||
|
// embedding_unassigned.key = embedding.id_datapoint
|
||||||
|
// embedding_unassigned.Value.Key = model
|
||||||
|
// embedding_unassigned.Value.Value = Embeddings
|
||||||
|
while (embeddingReader.Read())
|
||||||
|
{
|
||||||
|
int id_datapoint = embeddingReader.GetInt32(1);
|
||||||
|
string model = embeddingReader.GetString(2);
|
||||||
|
long length = embeddingReader.GetBytes(3, 0, null, 0, 0);
|
||||||
|
byte[] embedding = new byte[length];
|
||||||
|
embeddingReader.GetBytes(3, 0, embedding, 0, (int) length);
|
||||||
|
if (embedding_unassigned.TryGetValue(id_datapoint, out Dictionary<string, float[]>? embedding_unassigned_id_datapoint))
|
||||||
|
{
|
||||||
|
//embedding_unassigned_id_datapoint[model] = FloatArrayFromBytes(embedding);
|
||||||
|
embedding_unassigned[id_datapoint][model] = FloatArrayFromBytes(embedding);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
embedding_unassigned[id_datapoint] = new()
|
||||||
|
{
|
||||||
|
[model] = FloatArrayFromBytes(embedding)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
embeddingReader.Close();
|
||||||
|
|
||||||
|
//DbDataReader datapointReader = ExecuteSQLCommand("SELECT datapoint.id, id_entity, datapoint.name, probmethod_embedding FROM datapoint JOIN entity as en on Datapoint.id_entity JOIN searchdomain as sd on en.id_searchdomain WHERE sd.id=@id", parametersIDSearchdomain);
|
||||||
|
DbDataReader datapointReader = ExecuteSQLCommand("SELECT id, id_entity, name, probmethod_embedding FROM datapoint", parametersIDSearchdomain);
|
||||||
|
Dictionary<int, List<Datapoint>> datapoint_unassigned = [];
|
||||||
|
while (datapointReader.Read())
|
||||||
|
{
|
||||||
|
int id = datapointReader.GetInt32(0);
|
||||||
|
int id_entity = datapointReader.GetInt32(1);
|
||||||
|
string name = datapointReader.GetString(2);
|
||||||
|
string probmethodString = datapointReader.GetString(3);
|
||||||
|
Probmethods.probMethodDelegate? probmethod = probmethods.GetMethod(probmethodString);
|
||||||
|
if (embedding_unassigned.TryGetValue(id, out Dictionary<string, float[]>? embeddings) && probmethod is not null)
|
||||||
|
{
|
||||||
|
embedding_unassigned.Remove(id);
|
||||||
|
if (!datapoint_unassigned.ContainsKey(id_entity))
|
||||||
|
{
|
||||||
|
datapoint_unassigned[id_entity] = [];
|
||||||
|
}
|
||||||
|
datapoint_unassigned[id_entity].Add(new Datapoint(name, probmethod, [.. embeddings.Select(kv => (kv.Key, kv.Value))]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
datapointReader.Close();
|
||||||
|
|
||||||
|
//DbDataReader attributeReader = ExecuteSQLCommand("SELECT attribute.id, id_entity, attribute, value FROM attribute JOIN entity as en on attribute.id_entity JOIN searchdomain as sd on en.id_searchdomain WHERE sd.id=@id", parametersIDSearchdomain);
|
||||||
|
DbDataReader attributeReader = ExecuteSQLCommand("SELECT id, id_entity, attribute, value FROM attribute", parametersIDSearchdomain);
|
||||||
|
Dictionary<int, Dictionary<string, string>> attributes_unassigned = [];
|
||||||
|
while (attributeReader.Read())
|
||||||
|
{
|
||||||
|
//"SELECT id, id_entity, attribute, value FROM attribute JOIN entity on attribute.id_entity as en JOIN searchdomain on en.id_searchdomain as sd WHERE sd=@id"
|
||||||
|
int id = attributeReader.GetInt32(0);
|
||||||
|
int id_entity = attributeReader.GetInt32(1);
|
||||||
|
string attribute = attributeReader.GetString(2);
|
||||||
|
string value = attributeReader.GetString(3);
|
||||||
|
if (!attributes_unassigned.ContainsKey(id_entity))
|
||||||
|
{
|
||||||
|
attributes_unassigned[id_entity] = [];
|
||||||
|
}
|
||||||
|
attributes_unassigned[id_entity].Add(attribute, value);
|
||||||
|
}
|
||||||
|
attributeReader.Close();
|
||||||
|
|
||||||
|
DbDataReader entityReader = ExecuteSQLCommand("SELECT entity.id, name, probmethod FROM entity WHERE id_searchdomain=@id", parametersIDSearchdomain);
|
||||||
|
while (entityReader.Read())
|
||||||
|
{
|
||||||
|
//SELECT id, name, probmethod FROM entity WHERE id_searchdomain=@id
|
||||||
|
int id = entityReader.GetInt32(0);
|
||||||
|
string name = entityReader.GetString(1);
|
||||||
|
string probmethodString = entityReader.GetString(2);
|
||||||
|
if (!attributes_unassigned.TryGetValue(id, out Dictionary<string, string>? attributes))
|
||||||
|
{
|
||||||
|
attributes = [];
|
||||||
|
}
|
||||||
|
Probmethods.probMethodDelegate? probmethod = probmethods.GetMethod(probmethodString);
|
||||||
|
if (datapoint_unassigned.TryGetValue(id, out List<Datapoint>? datapoints) && probmethod is not null)
|
||||||
|
{
|
||||||
|
Entity entity = new(attributes, probmethod, datapoints, name)
|
||||||
|
{
|
||||||
|
id = id
|
||||||
|
};
|
||||||
|
entityCache.Add(entity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
entityReader.Close();
|
||||||
|
|
||||||
|
// TODO test this
|
||||||
|
|
||||||
|
modelsInUse = GetModels(entityCache);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<(float, string)> Search(string query, bool sort=true)
|
||||||
|
{
|
||||||
|
if (!embeddingCache.TryGetValue(query, out Dictionary<string, float[]>? queryEmbeddings))
|
||||||
|
{
|
||||||
|
queryEmbeddings = Datapoint.GenerateEmbeddings(query, modelsInUse, ollama);
|
||||||
|
if (embeddingCache.Count < embeddingCacheMaxSize) // TODO add better way of managing cache limit hits
|
||||||
|
{ // Idea: Add access count to each entry. On limit hit, sort the entries by access count and remove the bottom 10% of entries
|
||||||
|
embeddingCache.Add(query, queryEmbeddings);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
List<(float, string)> result = [];
|
||||||
|
|
||||||
|
foreach (Entity entity in entityCache)
|
||||||
|
{
|
||||||
|
List<(string, float)> datapointProbs = [];
|
||||||
|
foreach (Datapoint datapoint in entity.datapoints)
|
||||||
|
{
|
||||||
|
List<(string, float)> list = [];
|
||||||
|
foreach ((string, float[]) embedding in datapoint.embeddings)
|
||||||
|
{
|
||||||
|
string key = embedding.Item1;
|
||||||
|
float value = Probmethods.Similarity(queryEmbeddings[embedding.Item1], embedding.Item2);
|
||||||
|
list.Add((key, value));
|
||||||
|
}
|
||||||
|
datapointProbs.Add((datapoint.name, datapoint.probMethod(list)));
|
||||||
|
}
|
||||||
|
result.Add((entity.probMethod(datapointProbs), entity.name));
|
||||||
|
}
|
||||||
|
|
||||||
|
return [.. result.OrderByDescending(s => s.Item1)]; // [.. element] = element.ToList()
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<string> GetModels(List<Entity> entities)
|
||||||
|
{
|
||||||
|
List<string> result = [];
|
||||||
|
foreach (Entity entity in entities)
|
||||||
|
{
|
||||||
|
foreach (Datapoint datapoint in entity.datapoints)
|
||||||
|
{
|
||||||
|
foreach ((string, float[]) tuple in datapoint.embeddings)
|
||||||
|
{
|
||||||
|
string model = tuple.Item1;
|
||||||
|
if (!result.Contains(model))
|
||||||
|
{
|
||||||
|
result.Add(model);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetID()
|
||||||
|
{
|
||||||
|
Dictionary<string, dynamic> parameters = new()
|
||||||
|
{
|
||||||
|
["name"] = this.searchdomain
|
||||||
|
};
|
||||||
|
DbDataReader reader = ExecuteSQLCommand("SELECT id from searchdomain WHERE name = @name", parameters);
|
||||||
|
reader.Read();
|
||||||
|
this.id = reader.GetInt32(0);
|
||||||
|
reader.Close();
|
||||||
|
return this.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float[] FloatArrayFromBytes(byte[] bytes)
|
||||||
|
{
|
||||||
|
var floatArray = new float[bytes.Length / 4];
|
||||||
|
Buffer.BlockCopy(bytes, 0, floatArray, 0, bytes.Length);
|
||||||
|
return floatArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static byte[] BytesFromFloatArray(float[] floats)
|
||||||
|
{
|
||||||
|
var byteArray = new byte[floats.Length * 4];
|
||||||
|
var floatArray = floats.ToArray();
|
||||||
|
Buffer.BlockCopy(floatArray, 0, byteArray, 0, byteArray.Length);
|
||||||
|
return byteArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Entity? GetEntity(string name)
|
||||||
|
{
|
||||||
|
foreach (Entity entity in entityCache)
|
||||||
|
{
|
||||||
|
if (entity.name == name)
|
||||||
|
{
|
||||||
|
return entity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool HasEntity(string name)
|
||||||
|
{
|
||||||
|
return GetEntity(name) is not null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Entity? EntityFromJSON(string json)
|
||||||
|
{
|
||||||
|
JSONEntity? jsonEntity = JsonSerializer.Deserialize<JSONEntity>(json);
|
||||||
|
if (jsonEntity is null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (HasEntity(jsonEntity.name))
|
||||||
|
{
|
||||||
|
DatabaseRemoveEntity(jsonEntity.name);
|
||||||
|
}
|
||||||
|
int id_entity = DatabaseInsertEntity(jsonEntity.name, jsonEntity.probmethod, id);
|
||||||
|
foreach (KeyValuePair<string, string> attribute in jsonEntity.attributes)
|
||||||
|
{
|
||||||
|
DatabaseInsertAttribute(attribute.Key, attribute.Value, id_entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Datapoint> datapoints = [];
|
||||||
|
|
||||||
|
foreach (JSONDatapoint jsonDatapoint in jsonEntity.datapoints)
|
||||||
|
{
|
||||||
|
Dictionary<string, float[]> embeddings = Datapoint.GenerateEmbeddings(jsonDatapoint.text, [.. jsonDatapoint.model], ollama);
|
||||||
|
var probMethod_embedding = probmethods.GetMethod(jsonDatapoint.probmethod_embedding) ?? throw new Exception($"Unknown probmethod name {jsonDatapoint.probmethod_embedding}");
|
||||||
|
Datapoint datapoint = new(jsonDatapoint.name, probMethod_embedding, [.. embeddings.Select(kv => (kv.Key, kv.Value))]);
|
||||||
|
int id_datapoint = DatabaseInsertDatapoint(jsonDatapoint.name, jsonDatapoint.probmethod_embedding, id_entity);
|
||||||
|
foreach ((string, float[]) embedding in datapoint.embeddings)
|
||||||
|
{
|
||||||
|
DatabaseInsertEmbedding(id_datapoint, embedding.Item1, BytesFromFloatArray(embedding.Item2));
|
||||||
|
}
|
||||||
|
datapoints.Add(datapoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
var probMethod = probmethods.GetMethod(jsonEntity.probmethod) ?? throw new Exception($"Unknown probmethod name {jsonEntity.probmethod}");
|
||||||
|
Entity entity = new(jsonEntity.attributes, probMethod, datapoints, jsonEntity.name)
|
||||||
|
{
|
||||||
|
id = id_entity
|
||||||
|
};
|
||||||
|
entityCache.Add(entity);
|
||||||
|
return entity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DatabaseRemoveEntity(string name)
|
||||||
|
{
|
||||||
|
Dictionary<string, dynamic> parameters = new()
|
||||||
|
{
|
||||||
|
{ "name", name }
|
||||||
|
};
|
||||||
|
ExecuteSQLNonQuery("DELETE embedding.* FROM embedding JOIN datapoint dp ON id_datapoint = dp.id JOIN entity ON id_entity = entity.id WHERE entity.name = @name", parameters);
|
||||||
|
ExecuteSQLNonQuery("DELETE datapoint.* FROM datapoint JOIN entity ON id_entity = entity.id WHERE entity.name = @name", parameters);
|
||||||
|
ExecuteSQLNonQuery("DELETE attribute.* FROM attribute JOIN entity ON id_entity = entity.id WHERE entity.name = @name", parameters);
|
||||||
|
ExecuteSQLNonQuery("DELETE FROM entity WHERE name = @name", parameters);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int DatabaseInsertSearchdomain(string name)
|
||||||
|
{
|
||||||
|
Dictionary<string, dynamic> parameters = new()
|
||||||
|
{
|
||||||
|
{ "name", name },
|
||||||
|
{ "settings", "{}"} // TODO add settings. It's not used yet, but maybe it's needed someday...
|
||||||
|
};
|
||||||
|
return ExecuteSQLCommandGetInsertedID("INSERT INTO searchdomain (name, settings) VALUES (@name, @settings)", parameters);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int DatabaseInsertEntity(string name, string probmethod, int id_searchdomain)
|
||||||
|
{
|
||||||
|
Dictionary<string, dynamic> parameters = new()
|
||||||
|
{
|
||||||
|
{ "name", name },
|
||||||
|
{ "probmethod", probmethod },
|
||||||
|
{ "id_searchdomain", id_searchdomain }
|
||||||
|
};
|
||||||
|
return ExecuteSQLCommandGetInsertedID("INSERT INTO entity (name, probmethod, id_searchdomain) VALUES (@name, @probmethod, @id_searchdomain)", parameters);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int DatabaseInsertAttribute(string attribute, string value, int id_entity)
|
||||||
|
{
|
||||||
|
Dictionary<string, dynamic> parameters = new()
|
||||||
|
{
|
||||||
|
{ "attribute", attribute },
|
||||||
|
{ "value", value },
|
||||||
|
{ "id_entity", id_entity }
|
||||||
|
};
|
||||||
|
return ExecuteSQLCommandGetInsertedID("INSERT INTO attribute (attribute, value, id_entity) VALUES (@attribute, @value, @id_entity)", parameters);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public int DatabaseInsertDatapoint(string name, string probmethod_embedding, int id_entity)
|
||||||
|
{
|
||||||
|
Dictionary<string, dynamic> parameters = new()
|
||||||
|
{
|
||||||
|
{ "name", name },
|
||||||
|
{ "probmethod_embedding", probmethod_embedding },
|
||||||
|
{ "id_entity", id_entity }
|
||||||
|
};
|
||||||
|
return ExecuteSQLCommandGetInsertedID("INSERT INTO datapoint (name, probmethod_embedding, id_entity) VALUES (@name, @probmethod_embedding, @id_entity)", parameters);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int DatabaseInsertEmbedding(int id_datapoint, string model, byte[] embedding)
|
||||||
|
{
|
||||||
|
Dictionary<string, dynamic> parameters = new()
|
||||||
|
{
|
||||||
|
{ "id_datapoint", id_datapoint },
|
||||||
|
{ "model", model },
|
||||||
|
{ "embedding", embedding }
|
||||||
|
};
|
||||||
|
return ExecuteSQLCommandGetInsertedID("INSERT INTO embedding (id_datapoint, model, embedding) VALUES (@id_datapoint, @model, @embedding)", parameters);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DbDataReader ExecuteSQLCommand(string query, Dictionary<string, dynamic> parameters)
|
||||||
|
{
|
||||||
|
using MySqlCommand command = connection.CreateCommand();
|
||||||
|
command.CommandText = query;
|
||||||
|
foreach (KeyValuePair<string, dynamic> parameter in parameters)
|
||||||
|
{
|
||||||
|
command.Parameters.AddWithValue($"@{parameter.Key}", parameter.Value);
|
||||||
|
}
|
||||||
|
return command.ExecuteReader();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ExecuteSQLNonQuery(string query, Dictionary<string, dynamic> parameters)
|
||||||
|
{
|
||||||
|
using MySqlCommand command = connection.CreateCommand();
|
||||||
|
|
||||||
|
command.CommandText = query;
|
||||||
|
foreach (KeyValuePair<string, dynamic> parameter in parameters)
|
||||||
|
{
|
||||||
|
command.Parameters.AddWithValue($"@{parameter.Key}", parameter.Value);
|
||||||
|
}
|
||||||
|
command.ExecuteNonQuery();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int ExecuteSQLCommandGetInsertedID(string query, Dictionary<string, dynamic> parameters)
|
||||||
|
{
|
||||||
|
using MySqlCommand command = connection.CreateCommand();
|
||||||
|
|
||||||
|
command.CommandText = query;
|
||||||
|
foreach (KeyValuePair<string, dynamic> parameter in parameters)
|
||||||
|
{
|
||||||
|
command.Parameters.AddWithValue($"@{parameter.Key}", parameter.Value);
|
||||||
|
}
|
||||||
|
command.ExecuteNonQuery();
|
||||||
|
command.CommandText = "SELECT LAST_INSERT_ID();";
|
||||||
|
return Convert.ToInt32(command.ExecuteScalar());
|
||||||
|
}
|
||||||
|
}
|
||||||
21
src/embeddingsearch/embeddingsearch.csproj
Normal file
21
src/embeddingsearch/embeddingsearch.csproj
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.Data.SqlClient" Version="6.0.1" />
|
||||||
|
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.3" />
|
||||||
|
<PackageReference Include="MySql.Data" Version="9.2.0" />
|
||||||
|
<PackageReference Include="Npgsql" Version="9.0.3" />
|
||||||
|
<PackageReference Include="OllamaSharp" Version="5.1.9" />
|
||||||
|
<PackageReference Include="System.Configuration.ConfigurationManager" Version="9.0.3" />
|
||||||
|
<PackageReference Include="System.Data.SqlClient" Version="4.9.0" />
|
||||||
|
<PackageReference Include="System.Data.Sqlite" Version="1.0.119" />
|
||||||
|
<PackageReference Include="System.Numerics.Tensors" Version="9.0.3" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
161
src/models.py
161
src/models.py
@@ -1,161 +0,0 @@
|
|||||||
import util
|
|
||||||
import json
|
|
||||||
import datetime
|
|
||||||
|
|
||||||
class Embedding:
|
|
||||||
id:int
|
|
||||||
model:str
|
|
||||||
embedding:bytearray # TODO check if this can be bytes
|
|
||||||
parent_datapoint:int
|
|
||||||
|
|
||||||
def __init__(self, id, model, embedding, parent_datapoint:int):
|
|
||||||
self.id = id
|
|
||||||
self.model = model
|
|
||||||
self.embedding = embedding
|
|
||||||
self.parent_datapoint = parent_datapoint
|
|
||||||
|
|
||||||
class Datapoint:
|
|
||||||
id:int
|
|
||||||
name:str
|
|
||||||
probmethod:str
|
|
||||||
text:str
|
|
||||||
embeddings:list[Embedding]
|
|
||||||
embeddingHandler:util.EmbeddingHandler
|
|
||||||
parent_entity:int
|
|
||||||
|
|
||||||
def __init__(self, id:int, name:str, probmethod:str, text:str, embeddingHandler:util.EmbeddingHandler):
|
|
||||||
self.id = id
|
|
||||||
self.name = name
|
|
||||||
self.probmethod = probmethod
|
|
||||||
self.text = text
|
|
||||||
self.embeddings = []
|
|
||||||
self.embeddingHandler = embeddingHandler
|
|
||||||
|
|
||||||
class Attribute:
|
|
||||||
id:int
|
|
||||||
attribute:str
|
|
||||||
value:str
|
|
||||||
|
|
||||||
def __init__(self, id:int, attribute:str, value:str):
|
|
||||||
self.id = id
|
|
||||||
self.attribute = attribute
|
|
||||||
self.value = value
|
|
||||||
|
|
||||||
|
|
||||||
class Searchdomain_settings:
|
|
||||||
cache_maxentries:int
|
|
||||||
cache_revalidation_entity_add:bool # When an entity is added to the search domain, what do? True:
|
|
||||||
cache_revalidation_entity_remove:bool
|
|
||||||
cache_revalidation_embedding_update:bool
|
|
||||||
cache_revalidation_datapoint_create:bool
|
|
||||||
cache_revalidation_datapoint_update:bool
|
|
||||||
cache_revalidation_datapoint_remove:bool
|
|
||||||
|
|
||||||
def __init__(self, cache_maxentries = 10000, cache_revalidation_entity_add = True, cache_revalidation_entity_remove = True, cache_revalidation_embedding_update = True, cache_revalidation_datapoint_create = True, cache_revalidation_datapoint_update = True, cache_revalidation_datapoint_remove = True):
|
|
||||||
self.cache_maxentries = cache_maxentries
|
|
||||||
self.cache_revalidation_entity_add = cache_revalidation_entity_add
|
|
||||||
self.cache_revalidation_entity_remove = cache_revalidation_entity_remove
|
|
||||||
self.cache_revalidation_embedding_update = cache_revalidation_embedding_update
|
|
||||||
self.cache_revalidation_datapoint_create = cache_revalidation_datapoint_create
|
|
||||||
self.cache_revalidation_datapoint_update = cache_revalidation_datapoint_update
|
|
||||||
self.cache_revalidation_datapoint_remove = cache_revalidation_datapoint_remove
|
|
||||||
|
|
||||||
def as_json(self):
|
|
||||||
return json.dumps({"cache_maxentries": self.cache_maxentries,
|
|
||||||
"cache_revalidation_entity_add": self.cache_revalidation_entity_add,
|
|
||||||
"cache_revalidation_entity_remove": self.cache_revalidation_entity_remove,
|
|
||||||
"cache_revalidation_embedding_update": self.cache_revalidation_embedding_update,
|
|
||||||
"cache_revalidation_datapoint_create": self.cache_revalidation_datapoint_create,
|
|
||||||
"cache_revalidation_datapoint_update": self.cache_revalidation_datapoint_update,
|
|
||||||
"cache_revalidation_datapoint_remove": self.cache_revalidation_datapoint_remove})
|
|
||||||
|
|
||||||
def from_json(self, jsonstr):
|
|
||||||
data = json.loads(jsonstr)
|
|
||||||
try:
|
|
||||||
self.cache_maxentries = data["cache_maxentries"]
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
try:
|
|
||||||
self.cache_revalidation_entity_add = data["cache_revalidation_entity_add"]
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
try:
|
|
||||||
self.cache_revalidation_entity_remove = data["cache_revalidation_entity_remove"]
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
try:
|
|
||||||
self.cache_revalidation_embedding_update = data["cache_revalidation_embedding_update"]
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
try:
|
|
||||||
self.cache_revalidation_datapoint_create = data["cache_revalidation_datapoint_create"]
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
try:
|
|
||||||
self.cache_revalidation_datapoint_update = data["cache_revalidation_datapoint_update"]
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
try:
|
|
||||||
self.cache_revalidation_datapoint_remove = data["cache_revalidation_datapoint_remove"]
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
return self
|
|
||||||
|
|
||||||
class Searchresult:
|
|
||||||
text:str
|
|
||||||
last_access_date:datetime
|
|
||||||
results:list[float, str]
|
|
||||||
|
|
||||||
def __init__(self, text, last_access_date, results):
|
|
||||||
self.text = text
|
|
||||||
self.last_access_date = last_access_date
|
|
||||||
self.results = results
|
|
||||||
|
|
||||||
class Searchdomain:
|
|
||||||
id:int
|
|
||||||
name:str
|
|
||||||
settings:Searchdomain_settings
|
|
||||||
default_embeddinghandler:util.EmbeddingHandler
|
|
||||||
entity_cache:dict
|
|
||||||
entity_cache_invalid:bool
|
|
||||||
search_cache:dict
|
|
||||||
|
|
||||||
def __init__(self, id:int, name:str, settings:Searchdomain_settings, default_embeddinghandler:util.EmbeddingHandler):
|
|
||||||
self.id = id
|
|
||||||
self.name = name
|
|
||||||
self.settings = settings
|
|
||||||
self.default_embeddinghandler = default_embeddinghandler
|
|
||||||
self.entity_cache = {}
|
|
||||||
self.entity_cache_invalid = True
|
|
||||||
self.search_cache = {}
|
|
||||||
|
|
||||||
class Entity:
|
|
||||||
id:int
|
|
||||||
name:str
|
|
||||||
attributes:list[Attribute]
|
|
||||||
datapoints:list[Datapoint]
|
|
||||||
probmethod:str
|
|
||||||
searchdomain:Searchdomain
|
|
||||||
|
|
||||||
def __init__(self, id:int, name:str, attributes:list[Attribute], datapoints:list[Datapoint], probmethod:str, searchdomain:Searchdomain):
|
|
||||||
self.id = id
|
|
||||||
self.name = name
|
|
||||||
self.attributes = attributes
|
|
||||||
self.datapoints = datapoints
|
|
||||||
self.probmethod = probmethod
|
|
||||||
self.searchdomain = searchdomain
|
|
||||||
|
|
||||||
def get_attribute(self, attribute:str) -> Attribute:
|
|
||||||
attributes = [attribute_ for attribute_ in self.attributes if attribute_.attribute == attribute]
|
|
||||||
if len(attributes):
|
|
||||||
return attributes[0]
|
|
||||||
return None # "-> Attribute:" That was a lie
|
|
||||||
|
|
||||||
|
|
||||||
class Probmethods: # Kinda overkill. The class itself is itself technically just a dict anyway, so why bother?
|
|
||||||
# TODO check if this can be removed after initial tests
|
|
||||||
methods:dict
|
|
||||||
|
|
||||||
def __init__(self, methods:dict):
|
|
||||||
self.methods = methods
|
|
||||||
|
|
||||||
Binary file not shown.
@@ -1,12 +0,0 @@
|
|||||||
Title: Agile Methodologies: Embracing Flexibility in Software Development
|
|
||||||
|
|
||||||
In the dynamic landscape of software development, Agile methodologies have emerged as a transformative approach, promising flexibility and adaptability over traditional waterfall models. Agile methodologies, born from the 2001 Manifesto for Agile Software Development, emphasize collaboration, customer satisfaction, and responding to change.
|
|
||||||
|
|
||||||
These methodologies encourage an iterative and incremental development process where teams deliver working software in short timeboxes called sprints (typically two to four weeks). By breaking down projects into manageable chunks, teams can respond quickly to changing requirements, ensuring the final product meets or exceeds customer expectations.
|
|
||||||
|
|
||||||
Agile methodologies are not one-size-fits-all solutions. They encompass various frameworks like Scrum, Kanban, Extreme Programming (XP), and Feature-Driven Development (FDD), each with its unique practices and philosophies. For instance, Scrum is the most popular Agile methodology, emphasizing self-organizing teams, defined roles, and short daily meetings called stand-ups.
|
|
||||||
|
|
||||||
The benefits of adopting Agile methodologies extend beyond software development. They foster a culture of collaboration and open communication, promote continuous improvement, and encourage the rapid delivery of valuable functionality to customers. However, it's essential to remember that Agile is not a magic bullet—success requires a change in mindset, careful planning, and committed teamwork.
|
|
||||||
|
|
||||||
In conclusion, Agile methodologies offer organizations a flexible and responsive approach to software development. By embracing these principles, teams can deliver high-quality products quickly, adapt to changing requirements, and foster a collaborative and innovative work environment.
|
|
||||||
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
Title: Navigating the Moral Landscape of Artificial Intelligence
|
|
||||||
|
|
||||||
In the rapidly evolving world of technology, Artificial Intelligence (AI) has become an integral part of our daily lives. From recommending songs on music streaming platforms to self-driving cars, AI is omnipresent. However, as we continue to develop and rely on this intelligent machinery, it is crucial to address the ethical implications of its use.
|
|
||||||
|
|
||||||
Artificial Intelligence Ethics encompasses a series of principles that govern the responsible development and application of AI systems. These principles aim to ensure that AI serves humanity in a beneficial way, avoiding harm and discrimination. Key aspects include transparency, accountability, privacy, fairness, and safety.
|
|
||||||
|
|
||||||
Transparency requires that AI systems are explainable, so users can understand why certain decisions are being made. Accountability means holding developers responsible for the impact of their creations on society. Privacy is essential to safeguard individuals' personal data from misuse or unauthorized access. Fairness seeks to prevent biased algorithms from perpetuating existing social inequalities. Safety entails ensuring that AI systems do not pose a threat to human life or autonomy.
|
|
||||||
|
|
||||||
To navigate the moral landscape of AI, collaboration among all stakeholders – governments, industries, academia, and civil society – is crucial. Establishing robust ethical guidelines can help foster an AI ecosystem grounded in trust, respect, and responsibility. It is our collective duty to ensure that AI serves as a tool for human progress rather than a source of harm or exploitation.
|
|
||||||
|
|
||||||
As we continue to harness the power of AI, let us strive towards a future where technology works harmoniously with humanity, promoting peace, prosperity, and justice for all. The ethical development and application of AI is not just an option – it's our responsibility.
|
|
||||||
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
Title: Exploring Cloud Computing with Amazon Web Services (AWS)
|
|
||||||
|
|
||||||
Cloud computing, a revolutionary technology, is transforming the way businesses operate by offering on-demand access to a shared pool of configurable computing resources. One of the most prominent players in this domain is Amazon Web Services (AWS), a subsidiary of Amazon.com, that provides reliable, scalable, and secure cloud services to individuals, startups, and large enterprises alike.
|
|
||||||
|
|
||||||
Amazon Web Services offers over 175 fully-featured services from data centers globally. These services encompass computing power, storage options, content delivery networks, database service, analytics, application services, deployment services, management tools, and developer tools. This extensive suite of services allows developers and businesses to harness the benefits of cloud computing effortlessly.
|
|
||||||
|
|
||||||
With AWS, users can leverage the 'pay-as-you-go' pricing model, ensuring they only pay for the resources they consume, making it an affordable solution for businesses of all sizes. Moreover, AWS ensures high availability and fault tolerance by replicating data across multiple servers and Availability Zones (AZs) within a region. This infrastructure design minimizes downtime and increases the reliability of services.
|
|
||||||
|
|
||||||
AWS also prioritizes security, offering robust measures such as identity access management, encryption, and virtual private clouds to protect customer data. In addition, AWS provides tools like Amazon CloudWatch and Amazon CloudTrail for monitoring resources and tracking activity in AWS services, ensuring a secure environment for users.
|
|
||||||
|
|
||||||
In conclusion, Amazon Web Services offers a comprehensive cloud computing platform that empowers businesses to scale quickly, reduce IT costs, and focus on core competencies rather than managing infrastructure. With its extensive services, flexible pricing, high availability, and strong security measures, it's no wonder that AWS leads the cloud computing market. Whether you're a developer, startup, or large enterprise, AWS has something for everyone, making the leap into the cloud an easier and more rewarding journey than ever before.
|
|
||||||
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
Title: Understanding Continuous Integration and Continuous Delivery (CI/CD)
|
|
||||||
|
|
||||||
In the realm of modern software development, two key practices that have revolutionized the process are Continuous Integration (CI) and Continuous Delivery (CD). These methodologies aim to streamline the development lifecycle, reduce errors, and increase efficiency.
|
|
||||||
|
|
||||||
Continuous Integration (CI) is a practice where developers regularly merge their code changes into a central repository. Each integration creates a build that is automatically tested, ensuring the application continues to work as intended after every change. CI minimizes the time it takes to detect issues and makes it easier for teams to collaborate effectively.
|
|
||||||
|
|
||||||
On the other hand, Continuous Delivery (CD) extends the principles of CI to enable rapid and reliable software deployment. In a CD pipeline, once code passes through automated tests, it is automatically deployed to various stages such as staging or production environments. This process ensures that every change is deployable at any given moment, making releases faster and more predictable.
|
|
||||||
|
|
||||||
The synergy between CI and CD forms the foundation of DevOps culture, where collaboration, automation, and quality assurance are prioritized to drive successful software delivery. By adopting these practices, organizations can innovate faster, reduce technical debt, and deliver high-quality software consistently.
|
|
||||||
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
Title: Mastering Cybersecurity Fundamentals: A Comprehensive Guide
|
|
||||||
|
|
||||||
In our increasingly digital world, understanding Cybersecurity Fundamentals has become crucial for both individuals and organizations. This article aims to provide a comprehensive yet concise overview of the essential aspects of cybersecurity.
|
|
||||||
|
|
||||||
1. **Understanding Cybersecurity**: Cybersecurity is about protecting internet-connected systems, including hardware, software, and data, from attack, damage, or unauthorized access. It safeguards digital information and ensures privacy, integrity, and confidentiality.
|
|
||||||
|
|
||||||
2. **Key Concepts**: Some of the fundamental concepts in cybersecurity include authentication (verifying user identity), authorization (granting access based on identity and permissions), encryption (converting plain text into a code to secure communication), and firewalls (systems that monitor and control incoming and outgoing network traffic).
|
|
||||||
|
|
||||||
3. **Threat Landscape**: Cybersecurity threats come in various forms, such as malware, phishing attacks, ransomware, and denial-of-service attacks. Understanding these threats is vital to implementing effective defense strategies.
|
|
||||||
|
|
||||||
4. **Defensive Measures**: Implementing strong passwords, keeping software up-to-date, using antivirus software, and regularly backing up data are essential defensive measures for individuals. Organizations may also employ more advanced strategies like intrusion detection systems, penetration testing, and incident response plans.
|
|
||||||
|
|
||||||
5. **Education and Awareness**: One of the most powerful tools in cybersecurity is education and awareness. Regular training helps users recognize and respond to potential threats, reducing the risk of a successful attack.
|
|
||||||
|
|
||||||
6. **The Future of Cybersecurity**: As technology evolves, so do cyber threats. The field of cybersecurity will continue to grow and adapt, with increasing emphasis on artificial intelligence, machine learning, and automation in security systems.
|
|
||||||
|
|
||||||
Mastering Cybersecurity Fundamentals is an ongoing process, but this guide serves as a solid starting point for anyone looking to secure their digital world. Stay vigilant, stay informed, and stay secure!
|
|
||||||
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
Title: Mastering Data Structures and Algorithms for Efficient Programming
|
|
||||||
|
|
||||||
In the realm of computer science, mastery over data structures and algorithms is indispensable. These two concepts form the backbone of efficient problem-solving in software development, enabling developers to tackle complex tasks with ease and speed.
|
|
||||||
|
|
||||||
Data structures are organized ways to store, retrieve, and manipulate data in a way that makes it easy to work with them. They include arrays, linked lists, stacks, queues, trees, graphs, and hash tables, among others. Each has its unique properties and use cases, making them versatile tools for different programming challenges.
|
|
||||||
|
|
||||||
Algorithms, on the other hand, are step-by-step procedures designed to solve specific problems. They can be thought of as recipes for solving particular tasks efficiently, often leveraging the properties of data structures. Commonly used algorithms include search algorithms (linear search, binary search), sorting algorithms (bubble sort, quicksort, mergesort), and graph traversal algorithms (depth-first search, breadth-first search).
|
|
||||||
|
|
||||||
Understanding both data structures and algorithms is crucial for writing efficient code. By choosing the right data structure for a given problem and employing an optimal algorithm to manipulate it, developers can optimize their programs' performance significantly.
|
|
||||||
|
|
||||||
To become proficient in these areas, it's essential to practice with various problems, analyze their solutions, and explore different data structures and algorithms. Coding challenges, online tutorials, and books are great resources for honing your skills in this area.
|
|
||||||
|
|
||||||
Mastering data structures and algorithms not only enhances problem-solving abilities but also equips developers with the tools needed to create scalable, robust software that stands the test of time. Embrace this knowledge, and watch your coding prowess soar!
|
|
||||||
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
Title: Data Visualization with D3.js: Unlocking Insights from Raw Data
|
|
||||||
|
|
||||||
Data visualization has become an essential tool in today's data-driven world, and one of the most popular libraries for this purpose is D3.js (Data-Driven Documents). This powerful JavaScript library allows developers to create dynamic, interactive, and scalable data visualizations directly in the web browser.
|
|
||||||
|
|
||||||
D3.js, developed by Mike Bostock at the New York Times, stands out from other visualization libraries due to its flexibility and ability to bind data to document objects (DOM elements), providing a unique approach to data-driven design. This binding allows for seamless integration of complex data with HTML, CSS, and SVG, making it possible to create custom visualizations that are tailored to specific use cases.
|
|
||||||
|
|
||||||
With D3.js, developers can tackle diverse tasks ranging from simple bar charts to intricate network graphs or geographical maps. The library's capabilities extend beyond traditional data representation, offering tools for motion graphics and interactive storytelling in addition to static visualizations.
|
|
||||||
|
|
||||||
Moreover, D3.js is scalable, capable of handling large datasets without sacrificing performance. It also emphasizes best practices for responsive design, ensuring that your visualizations look great on any device or screen size.
|
|
||||||
|
|
||||||
In summary, D3.js offers a robust solution for data visualization in web applications. By mastering this versatile library, developers can transform raw data into captivating and insightful visual stories that engage audiences and facilitate effective decision-making. Whether you're working on a small personal project or leading a large-scale data analysis initiative, D3.js is an indispensable tool for unlocking the hidden patterns within your data.
|
|
||||||
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
Title: Deep Learning with TensorFlow: A Comprehensive Guide
|
|
||||||
|
|
||||||
In the realm of artificial intelligence, deep learning has emerged as a revolutionary force, capable of solving complex problems and achieving human-like performance in various domains. One of the most popular libraries for implementing deep learning models is TensorFlow, an open-source platform developed by Google Brain Team. This guide aims to introduce you to deep learning with TensorFlow.
|
|
||||||
|
|
||||||
Deep learning algorithms are a subset of machine learning that use neural networks with many layers to learn and make predictions. These models can identify patterns in large, unstructured datasets, making them ideal for tasks such as image recognition, natural language processing, and predictive analytics.
|
|
||||||
|
|
||||||
TensorFlow provides a flexible ecosystem for both research and production. It allows you to build and train deep learning models using a variety of architectures, including convolutional neural networks (CNNs), recurrent neural networks (RNNs), and long short-term memory (LSTM) networks.
|
|
||||||
|
|
||||||
To get started with TensorFlow, you'll need to install the library on your machine. You can do this by using pip or conda, depending on your preferred package manager. Once installed, you can begin exploring the TensorFlow API.
|
|
||||||
|
|
||||||
The TensorFlow API is divided into several modules:
|
|
||||||
|
|
||||||
1. tf.keras: The high-level API for building and training deep learning models. It provides a user-friendly interface for defining and training neural networks.
|
|
||||||
|
|
||||||
2. tf.contrib: A collection of experimental features and utilities that are not part of the core TensorFlow API.
|
|
||||||
|
|
||||||
3. tf.tensorflow: The low-level API, which gives you direct control over operations on tensors (multi-dimensional arrays).
|
|
||||||
|
|
||||||
To create a deep learning model using TensorFlow, follow these steps:
|
|
||||||
|
|
||||||
1. Import the necessary modules and initialize your data.
|
|
||||||
|
|
||||||
2. Define your model architecture, using layers such as Dense, Conv2D, MaxPooling2D, LSTM, etc., depending on the task at hand.
|
|
||||||
|
|
||||||
3. Compile the model by specifying the loss function, optimizer, and metrics to be tracked during training.
|
|
||||||
|
|
||||||
4. Train the model using your dataset, either by feeding it batches of data or using generators for efficient data loading.
|
|
||||||
|
|
||||||
5. Evaluate the performance of the model on a separate test dataset.
|
|
||||||
|
|
||||||
6. Save the trained model for future use or deployment in a production environment.
|
|
||||||
|
|
||||||
Deep learning with TensorFlow is an exciting journey that offers countless opportunities for innovation and problem-solving. With its robust architecture, extensive documentation, and active community, TensorFlow empowers developers to build powerful and accurate deep learning models. So, join the thousands of enthusiasts who are using TensorFlow to shape the future of AI!
|
|
||||||
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
Title: Top DevOps Best Practices for Successful Collaboration and Delivery
|
|
||||||
|
|
||||||
In the rapidly evolving world of software development, adhering to best practices is crucial for maintaining high-quality products and efficient workflows. Here are some key DevOps best practices that ensure smooth collaboration between development and operations teams.
|
|
||||||
|
|
||||||
1. **Collaboration and Communication**: Successful DevOps depends on strong communication channels between developers and operations professionals. Regular meetings, shared tools, and clear documentation help to foster a culture of openness, transparency, and mutual understanding.
|
|
||||||
|
|
||||||
2. **Continuous Integration (CI) and Continuous Delivery (CD)**: Implementing CI/CD pipelines enables automatic testing and deployment of code changes, reducing the risk of errors and ensuring faster delivery times. This practice encourages small, frequent updates rather than large, infrequent ones.
|
|
||||||
|
|
||||||
3. **Automated Testing**: Automated tests help catch issues early in the development process, preventing them from affecting production environments. By using tools like Selenium or Jest, teams can write reliable test suites to validate their code.
|
|
||||||
|
|
||||||
4. **Infrastructure as Code (IaC)**: Managing infrastructure using code allows for easy version control, reproducibility, and consistency across environments. Tools such as Terraform, AWS CloudFormation, or Azure Resource Manager help manage and provision infrastructure efficiently.
|
|
||||||
|
|
||||||
5. **Monitoring and Logging**: Implementing monitoring solutions like Datadog, Splunk, or Prometheus allows teams to keep track of system performance, identify bottlenecks, and troubleshoot issues more quickly. Detailed logging is essential for understanding the behavior of complex systems and improving them over time.
|
|
||||||
|
|
||||||
6. **Security**: Security should be a priority throughout the entire software development lifecycle (SDLC). Implementing practices like threat modeling, penetration testing, and using tools like OWASP ZAP or Nessus can help teams detect vulnerabilities early and address them promptly.
|
|
||||||
|
|
||||||
7. **Continuous Improvement**: DevOps emphasizes the importance of continuous learning, experimentation, and iteration. Regularly analyzing performance metrics, customer feedback, and team productivity helps organizations identify areas for improvement and continuously refine their processes.
|
|
||||||
|
|
||||||
Adopting these best practices can lead to improved collaboration, faster delivery times, higher-quality software, and increased customer satisfaction in the DevOps ecosystem. By staying agile and flexible in an ever-changing technological landscape, teams can ensure success in the world of DevOps.
|
|
||||||
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
Überschrift: Familienforschung und Erbenermittlung
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Im Institut für Stadtgeschichte stehen dem Familienforscher im Wesentlichen zwei Quellen zur Verfügung:
|
|
||||||
|
|
||||||
die Adressbücher der Stadt Gelsenkirchen und ihrer Vorläufergemeinden (ab 1888)
|
|
||||||
die Einwohnermeldekarteien der Stadt Gelsenkirchen und ihren Vorläufergemeinden
|
|
||||||
|
|
||||||
Die Benutzung von Archiv- und Bibliotheksgut im Stadtarchiv Gelsenkirchen ist grundsätzlich entgeltfrei.
|
|
||||||
Recherchen zur Familienforschung aus der Einwohnermeldekartei können nur von den Archivkolleginnen und Archivkollegen des Instituts für Stadtgeschichte durchgeführt werden und sind daher kostenpflichtig. Es gelten die Sätze der aktuellen Benutzungs- und Gebührenordnung für das Institut für Stadtgeschichte Gelsenkirchen vom 24.06.2019. Aufgrund der zahlreichen Anfragen zur Familienforschung und Erbenermittlung ist mit einer längeren Bearbeitungszeit zu rechnen.
|
|
||||||
Die Auskünfte werden grundsätzlich in deutscher Sprache erteilt.
|
|
||||||
Seit dem 1. Januar 2009 gilt ein neues Personenstandsgesetz , das die Übergabe der Personenstandsregister von den Staatsämtern an die kommunalen Archive regelt. Dementsprechend hat das Stadtarchiv die folgenden Personenstandsregister vom Standesamt Gelsenkirchen übernommen:
|
|
||||||
|
|
||||||
Geburtsregister von 1874 – 1910
|
|
||||||
Heiratsregister von 1874 – 1940
|
|
||||||
Sterberegister von 1874 – 1990
|
|
||||||
|
|
||||||
Eigene Recherchen in den Personenstandsregistern durch die Benutzerinnen und Benutzer selbst sind aus konservatorischen Gründen nicht möglich. Aus denselben Gründen können auch keine Fotokopien angefertigt werden. Das Institut für Stadtgeschichte bearbeitet schriftliche Anfragen bei Vorlage konkreter Geburts-, Heirats- oder Sterbedaten entsprechend der Gebührenordnung des Instituts für Stadtgeschichte Gelsenkirchen und erstellt Kopien oder beglaubigte Kopien durch digitale Reproduktionen aus den Registerbänden.
|
|
||||||
Voraussetzungen
|
|
||||||
Anfragen zur privaten Familienforschung und Erbenermittlung sind grundsätzlich in schriftlicher Form, gerne auch per e-mail, an das Institut für Stadtgeschichte zu richten.
|
|
||||||
Zudem ist eine schriftliche Bestätigung zur Übernahme der Bearbeitungskosten gemäß der Benutzungs- und Gebührenordnung des Instituts für Stadtgeschichte vom 24.06.2019 notwendig. Anfragen ohne Zusicherung einer Kostenübernahme können nicht bearbeitet werden.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
Schriftliche Anfrage mit Zusicherung der Kostenübernahme.
|
|
||||||
Gebühren
|
|
||||||
Es gilt die Benutzungs- und Gebührenordnung des Instituts für Stadtgeschichte Gelsenkirchen vom 24.06.2019.
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
Überschrift: Abstimmungsbescheinigung
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Erteilung der Abstimmungsbescheinigung gemäß des Alten- und Pflegegesetzes des Landes Nordrhein-Westfalen und seiner Durchführungsverordnung
|
|
||||||
Maßnahmen für teil- und vollstationäre Pflegeeinrichtungen in der Planungsphase hat der Träger der Einrichtung mit dem örtlichen Träger der Sozialhilfe abzustimmen. Über die Abstimmung wird ein Bescheid erteilt.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
nach Absprache
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
Überschrift: Investitionsförderung ambulanter Pflegeeinrichtungen
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Ambulante Pflegeeinrichtungen werden gefördert, wenn die Voraussetzungen des Alten- und Pflegegesetzes NRW erfüllt sind, die Qualitätsvorgaben nach der Vereinbarung zur Qualitätssicherung gem. § 80 SGB XI eingehalten und den Pflegebedürftigen keine Investitionsaufwendungen berechnet werden. Die Zuwendung ist jährlich vom Träger der ambulanten Pflegeeinrichtung schriftlich bis zum 01. März beim örtlichen Träger der Sozialhilfe zu beantragen.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
nach Absprache
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
Überschrift: HIV-Test
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Die Stadt Gelsenkirchen bietet die Möglichkeit für einen anonymen und kostenlosen HIV-Test (AIDS-Test). Dabei wird Blut auf HIV getestet. Für diesen HIV-Test gibt es zwei Testverfahren. Nach einer vorherigen Beratung entscheiden wir gemeinsam, welches Verfahren für Sie in Frage kommt:
|
|
||||||
Vollbluttest oderHIV SchnelltestBei dem Vollbluttest wird Blut aus der Vene entnommen. Das Ergebnis der Blutuntersuchung liegt nach circa sieben Tagen vor und wird persönlich mitgeteilt. Der Test hat eine hohe Sicherheit (99,9 Prozent). Wichtig ist, dass der Test erst nach 6 Wochen nach einem möglichen Ansteckungsrisiko aussagekräftig wird.
|
|
||||||
Bei dem HIV-Schnelltest wird Blut aus dem Finger entnommen und in eine Testkassette gegeben. Das Ergebnis liegt nach 30 Minuten vor und wird dann persönlich mitgeteilt. Die Sicherheit des Schnelltests ist vergleichbar mit der des Vollbluttests. Der Test ist sehr sensibel und im Einzelfall kann es deshalb auch zu Reaktionen mit anderen Nicht-HIV-Antikörpern kommen. Deswegen wird ein reaktives Ergebnis im Schnelltest immer mit einem Vollbluttest (siehe oben) überprüft. Der HIV-Schnelltest kann erst nach zwölf Wochen nach einem möglichen Ansteckungsrisiko durchgeführt werden, denn erst dann ist er aussagekräftig.
|
|
||||||
Die HIV-Testergebnisse werden grundsätzlich immer persönlich vor Ort mitgeteilt!
|
|
||||||
Der HIV-Test ist anonym und kostenlos; die Mitarbeiterinnen und Mitarbeiter der Stadt sind zur Verschwiegenheit verpflichtet.
|
|
||||||
Im Rahmen des HIV-Tests sind Tests auf weitere sexuell übertragbare Infektionen möglich.
|
|
||||||
Ausführliche Informationen zu den einzelnen sexuell übertragbaren Infektionen können Sie im Beratungsgespräch erfragen oder sich vorab auf seriösen Seiten informieren.Weitere Informationen über HIV und sexuelle Gesundheit
|
|
||||||
Benötigte Unterlagen
|
|
||||||
keine
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
Überschrift: Veranstaltung anmelden
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Ob Festivals, Konzerte oder Sport-Events wie zum Beispiel der VIVAWEST Marathon: Veranstaltungen sind eine willkommene Abwechslung. Allerdings sind sie breit gefächert und stellen Organisatoren oft vor große Herausforderung.
|
|
||||||
Je nach Art oder Ort der Veranstaltung benötigen Sie unterschiedliche Genehmigungen von unterschiedlichen Behörden, hinzukommend muss eine Veranstaltung für alle sicher gestaltet werden. Um Sie hierbei optimal zu unterstützen, welche Anträge beispielsweise erforderlich sind oder was Sie ferner beachten müssen, steht Ihnen Kathrin Albrecht als zentrale Ansprechpartnerin zur Verfügung.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
|
|
||||||
abhängig von der Art der Veranstaltung (wird im Gespräch geklärt)
|
|
||||||
|
|
||||||
Gebühren
|
|
||||||
|
|
||||||
Die Beratung ist kostenlos.
|
|
||||||
mögliche Folgekosten für Genehmigungen etc. je nach Veranstaltungart
|
|
||||||
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
Überschrift: Einschulungsuntersuchungen
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Die Schuleingangsuntersuchung ist grundsätzlich eine Pflichtuntersuchung nach Schulgesetz NRW, bei der alle Kinder im Schuleintrittsalter individuell nach schulrelevanten Gesundheitsaspekten untersucht werden. Ziel dieser Untersuchung ist es, zum einen eine medizinische Einschätzung zur Einschulung der Kinder zu geben. Zum anderen sollen mögliche Beeinträchtigungen für den Schulbesuch und für die Entwicklung der Kinder früh erkannt werden, mit dem Ziel diese durch fördernde und kompensatorische Maßnahmen auszugleichen. Die Untersuchung umfasst eine Prüfung der Sinnesorgane sowie die Erfassung des bisherigen Entwicklungsstandes des Kindes.
|
|
||||||
Bereits vor der Untersuchung müssen die Eltern allerdings einige Vorbereitungen treffen, um die Dauer der Untersuchung vor Ort zu verkürzen:
|
|
||||||
Alle wichtigen Informationen hierzu finden Sie auf dieser Seite. Da das Angebot an Informationen an dieser Stelle stetig erweitert wird, schauen Sie bitte auch kurz vor der Untersuchung noch einmal auf diese Seite, ob Sie noch etwas für die Untersuchung vorbereiten können.
|
|
||||||
Bitte lassen Sie sich nicht von Berichten anderer Eltern über bereits erfolgte Einladungen zur Untersuchung verunsichern! Die Reihenfolge der Einladung der Kinder im Verlauf des Jahres erfolgt flexibel nach verschiedenen Kriterien. Dem Kinder- und Jugendmedizinischen Dienst sind grundsätzlich alle schulpflichtigen Kinder bekannt, so dass auch Ihr Kind automatisch zur Untersuchung eingeladen wird. Einige Wochen vor der Untersuchung erhalten Sie ein Einladungsschreiben zur Untersuchung mit dem vorgesehenen Untersuchungstermin und weiteren Informationen. Bitte bringen Sie unbedingt die dort genannten Dokumente mit (siehe unten).
|
|
||||||
Wir freuen uns, Sie und Ihr Kind in der Untersuchung kennenzulernen!
|
|
||||||
Voraussetzungen
|
|
||||||
Das Kind muss im folgenden Schuljahr schulpflichtig werden und seinen Wohnsitz in Gelsenkirchen haben.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
|
|
||||||
Impfheft
|
|
||||||
gelbes U-Heft
|
|
||||||
weitere ärztliche Berichte
|
|
||||||
Elternbogen (siehe unten) ausgefüllt
|
|
||||||
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
Überschrift: Beistandschaft
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Die Beistandschaft ist ein kostenloses Hilfsangebot des Jugendamtes und hilft Ihnen, die Vaterschaft zu Ihrem Kind festzustellen und die Unterhaltsansprüche Ihres Kindes zu regeln.
|
|
||||||
Wenn der Vater zu einer freiwilligen Anerkennung der Vaterschaft und / oder Zahlung des Unterhaltes nicht bereit ist, vertritt der Beistand Ihr Kind auch in einem gerichtlichen Verfahren.
|
|
||||||
Durch die Beistandschaft wird das elterliche Sorgerecht nicht eingeschränkt.
|
|
||||||
Voraussetzungen
|
|
||||||
Die Beistandschaft kann der Elternteil einrichten, dem die alleinige elterliche Sorge zusteht, bei gemeinsamer Sorge, der Elternteil, in dessen Obhut sich das Kind befindet.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
|
|
||||||
Geburtsurkunde des Kindes
|
|
||||||
gültige Ausweispapiere
|
|
||||||
evtl. Scheidungsurteil / Nachweis über bestehende Vaterschaft
|
|
||||||
evtl. bestehende Unterhaltsvereinbarung / Unterhaltstitel
|
|
||||||
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
Überschrift: Bescheinigung/ Belehrung nach § 43 Infektionsschutzgesetz (IfSG)
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Wer beruflich und/oder ehrenamtlich direkten Kontakt mit offenen Lebensmitteln hat, in Küchen oder Einrichtungen zur Gemeinschaftsverpflegung tätig ist und/oder Gegenstände wie Geschirr reinigt, braucht vor Antritt der Tätigkeit eine Belehrung durch das zuständige Referat Gesundheit.
|
|
||||||
Die Belehrungen finden in der Regel online statt. Sie werden durch das Technologiezentrum Glehn im Auftrag der Stadt Gelsenkirchen durchgeführt. Sie können sich direkt beim externen Dienstleister für die Online-Belehrung anmelden. Alle weiteren Informationen zur Online-Belehrung finden Sie in unserem FAQ. Die Belehrung beinhaltet alle rechtlichen Voraussetzungen und die gesundheitlichen Risiken, die es bei der Tätigkeit im Lebensmittelbereich zu beachten gilt. Die Teilnehmenden erfahren, wie die Übertragung von Infektionskrankheiten minimiert werden kann, wie Symptome erkannt werden können und wann eine Tätigkeit aufgrund einer Infektionskrankheit nicht weiter ausgeübt werden darf.
|
|
||||||
Im Anschluss erhalten die Teilnehmenden die Bescheinigung über die Erstbelehrung. Diese Bescheinigung benötigen die Betriebe vor der Aufnahme der Tätigkeit.
|
|
||||||
Sollten Sie die Belehrung für eine ehrenamtliche Tätigkeit oder ein schulisches Praktikum oder für Ihre Tätigkeit bei der Stadt Gelsenkirchen benötigen, melden Sie sich bitte zu einer Präsenz-Belehrung im Referat Gesundheit unter der Rufnummer 169-2924 an.
|
|
||||||
Voraussetzungen
|
|
||||||
Vor der Belehrung müssen Sie unbedingt einen Termin vereinbaren.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
|
|
||||||
gültige amtliche Ausweispapiere mit Lichtbild (Reisepass oderPersonalausweis)
|
|
||||||
|
|
||||||
Gebühren
|
|
||||||
25,00 Euro
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
Überschrift: Familienhebammen
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Die Familienhebammen und die Kinderkrankenschwester der Stadt Gelsenkirchen begleiten und unterstützen werdende und junge Familien in besonderen Lebenslagen.
|
|
||||||
Dies bedeutet konkret:
|
|
||||||
|
|
||||||
Begleitung in der Schwangerschaft mit dem Schwerpunkt der Beziehungsförderung der Mutter / Vater zu sich und dem ungeborenem Kind
|
|
||||||
Geburtsvorbereitung mit dem Schwerpunkt auf Stärkung der Bereitschaft zum natürlichen Geburtsvorgang
|
|
||||||
Begleitung im Säuglingsalter vor allem in der Gestaltung der Mutter-Vater-Kind- Beziehung und Förderung des Bewusstseins zur Beachtung der kindlichen Bedürfnisse mit Anregungen und praktischen Einübungen
|
|
||||||
Förderung und Beobachtung der kindlichen Entwicklung
|
|
||||||
Unterstützung bei der Teilnahme an Vorsorge- und Präventionsmaßnahmen von Mutter/Eltern und Kind
|
|
||||||
|
|
||||||
Über alle drei Phasen Hilfestellung der anstehenden Herausforderungen u.a.
|
|
||||||
|
|
||||||
Neugestaltung der veränderten Beziehungs- und Familiensituation
|
|
||||||
Sicherstellung der geeigneten Wohnungssituation und der Anschaffung der Grundausstattung
|
|
||||||
Begleitung zu Ämtern, Ärzten, Therapien und Beratungen
|
|
||||||
|
|
||||||
Voraussetzungen
|
|
||||||
Kontakt aufnnehmen kann selbstständig jede Familie, die glaubt, umfangreichere Unterstützung zu benötigen oder Institutionen, die eine Familie vermitteln wollen.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
keine
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
Überschrift: Impfberatung
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Das ärztliche Personal des Referats Gesundheit hilft Ihnen
|
|
||||||
|
|
||||||
bei allen Fragen zu Impfungen
|
|
||||||
bei den zu treffenden medizinischen Vorkehrungen bei In- und Auslandsreisen (Fernreisen)
|
|
||||||
bei der Vermeidung gesundheitlicher Gefahren auf Ihren Reisen
|
|
||||||
|
|
||||||
Sie haben die Möglichkeit sich per Telefon, oder im persönlichen Gespräch nach Terminabsprache, beraten zu lassen.
|
|
||||||
Unsere Auskünfte bereiten das Gespräch mit dem Arzt, der impft und/oder die Medikamente verordnet, vor, ersetzen es aber nicht.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
Impfpass
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
Überschrift: Geobasisdaten
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Geobasisdaten sind Geometrieinformationen (Punkte, Linien und Flächen) mit Bezug auf den Grund und Boden eines bestimmten Gebietes. Dazu zählen Geoinformationen aus dem Liegenschaftskataster (Flurstücke, Gebäude), aus der Amtlichen Basiskarte oder der Stadtkarte und auch Luftbilder.
|
|
||||||
Für einen angegebenen räumlichen Bereich können digitale Geobasisdaten in vielen gängigen Vektor- oder Rasterdatenformaten zur Verfügung gestellt werden.
|
|
||||||
Für die Durchführung von Höhenmessungen sind im gesamten Stadtgebiet von Gelsenkirchen Höhenpunkte amtlich vermessen. Auf Antrag können auch Auszüge aus der Höhendatenbank erstellt werden.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
Gebietsangabe, Adresse, …
|
|
||||||
Gebühren
|
|
||||||
Die Gebühren richten sich nach der Gebührenordnung für das amtliche Vermessungswesen.
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
Überschrift: Abfallberatung bei Abbruchmaßnahmen
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Wir sind Ansprechpartner bei der Überwachung von Abbruchmaßnahmen.
|
|
||||||
Abbruchunternehmer (m/w)
|
|
||||||
|
|
||||||
Sie haben Fragen zur Abfalldeklaration? - wir beraten Sie gerne!
|
|
||||||
Sie benötigen Hilfe für die Erstellung eines Rückbau- und Entsorgungskonzeptes? - wir haben einen Leitfaden für Sie!
|
|
||||||
|
|
||||||
Bauherren (m/w)
|
|
||||||
|
|
||||||
Sie suchen einen Abbruchunternehmer? - wir helfen Ihnen gerne!
|
|
||||||
Benötigen Sie einen Gutachter? - wir prüfen die Erfordernis!
|
|
||||||
Sie haben Fragen zur Abfallentsorgung? - wir geben Ihnen Auskunft!
|
|
||||||
|
|
||||||
Anwohner (m/w)
|
|
||||||
|
|
||||||
Auf der Baustelle staubt es zu stark? - wir kümmern uns für Sie!
|
|
||||||
Auf der Baustelle werden gefährliche Abfälle unsachgemäß gelagert? - Sie melden, wir handeln!
|
|
||||||
|
|
||||||
Benötigte Unterlagen
|
|
||||||
keine
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
Überschrift: Antrag auf Verschmelzung von Flurstücken
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Wenn Flurstücke im Grundbuch unbelastet oder gleich belastet sind und örtlich und wirtschaftlich eine Einheit bilden, können diese Flurstücke im Kataster verschmolzen und anschließend im Grundbuch vereinigt werden. Eine Verschmelzung von Flurstücken ist gebührenfrei. Der Antrag ist persönlich beim Referat 62 zu stellen.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
keine
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
Überschrift: Terminvergabe amtsärztliche Untersuchungen
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Der amtsärztliche Dienst erstellt Bescheinigungen, Stellungnahmen und Gutachten aufgrund bundes oder landesrechtlicher Vorschriften. Auftraggeber sind Behörden von Bund, Länder und Gemeinden, Gerichte und andere öffentlich-rechtliche Institutionen.
|
|
||||||
Im Falle folgender Anlässe können Sie sich an uns zu einer Terminvergabe einer amtsärztlichen Untersuchung wenden:
|
|
||||||
|
|
||||||
Stellungnahme zur Einstellung in den öffentlichen Dienst und zur Verbeamtung
|
|
||||||
Beurteilung der Beihilfefähigkeit einer Kur- oder Rehamaßnahme
|
|
||||||
Stellungnahme zur Prüfungsfähigkeit im Rahmen einer Staatsprüfung
|
|
||||||
|
|
||||||
Zu anderen Anlässen öffentlicher Auftraggeber erhalten wir von dort schriftliche Untersuchungsaufträge. In diesen Fällen kontaktieren wir Sie postalisch mit einem Einladungsschreiben, wenn eine amtsärztliche Untersuchung erforderlich ist.
|
|
||||||
Voraussetzungen
|
|
||||||
|
|
||||||
ihr Wohnort ist Gelsenkirchen
|
|
||||||
zur Terminierung muss das Auftragsschreiben hier per Mail, Post oder Fax vorliegen (außer Prüfungsfähigkeit).
|
|
||||||
|
|
||||||
Wenn Sie sich zum Beispiel per Mail an uns wenden, übermitteln Sie uns:
|
|
||||||
|
|
||||||
Name und Anschrift
|
|
||||||
Geburtsdatum
|
|
||||||
Einstellungsdatum
|
|
||||||
Schreiben des Auftraggebers (PDF)
|
|
||||||
Ihre Telefonnummer zwecks Rückfragen/ Terminbestätigung
|
|
||||||
|
|
||||||
Stellungnahmen zur Prüfungsfähigkeit werden durchgeführt, wenn das amtsärztliche Zeugnis im Krankheitsfall rechtsverbindlich vorgeschrieben ist und sich ihr erster oder zweiter Wohnsitz in Gelsenkirchen befindet.Als rechtsverbindlich gelten:
|
|
||||||
|
|
||||||
die Approbationsordnungen für Ärzte, Zahnärzte, Tierärzte und Apotheker
|
|
||||||
§§ 20 und 53 des Juristenausbildungsgesetzes NRW – JAG NRW
|
|
||||||
§ 7 des Lehrerausbildungsgesetzes – LABGi.V.m. § 35 der Ordnung f.d. Vorbereitungsdienst u.d. Staatsprüfung an Schulen - OVP
|
|
||||||
§ 30 der VO zur Durchführung der Vorschriften über Steuerberater (u.a.) – DVStB
|
|
||||||
§ 7 Abs. 2 Satz 4 der PrüfungsVO f.d. mittl. nichttechn. Zolldienst - MntZollDvDv
|
|
||||||
§ 20 Ausbildungs- und Prüfungsverordnung für die Pflegeberufe (PflAPrV)
|
|
||||||
|
|
||||||
Schulordnungen oder privatrechtliche Einigungen mit der Ausbildungsstelle haben keine Rechtsverbindlichkeit.
|
|
||||||
Amtsärztliche Stellungnahmen zur Prüfungsfähigkeit können nicht nach dem Prüfungstermin ausgestellt werden.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
Zum Untersuchungstermin bringen Sie bitte mit:
|
|
||||||
|
|
||||||
einen gültigen Personalausweis/Pass
|
|
||||||
verfügbare medizinische Informationen wie Behandlungsberichte etc.
|
|
||||||
|
|
||||||
Bei Stellungnahmen zur Prüfungsfähigkeit bringen Sie bitte mit:
|
|
||||||
|
|
||||||
einen gültigen Personalausweis/Pass
|
|
||||||
Das Attest eines behandelnden Arztes über die aktuell vorliegende Erkrankung mit Nennung der Diagnose und Dauer der Prüfungsunfähigkeit.
|
|
||||||
|
|
||||||
Gebühren
|
|
||||||
Die Gebühr richtet sich nach der Art der Untersuchung. Nähere Informationen erhalten Sie bei der Terminvergabe.
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
Überschrift: Vorkaufsrechtsbescheinigung
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Prüfung des gesetzlichen Vorkaufsrechts nach den §§ 24 – 28 Baugesetzbuch und Erteilung der Negativbescheinigung zur Eigentumsumschreibung im Grundbuch. Außerdem Prüfung des Vorkaufrechtes gemäß § 40 Straßen- und Wegegesetz NRW.
|
|
||||||
Hinweise für Notare
|
|
||||||
Das Verfahren zur Ausstellung eines Zeugnisses über die Nichtausübung bzw. das Nichtbestehen eines Vorkaufsrechts nach § 28 BauGB erfolgt bei der Stadt Gelsenkirchen elektronisch im Rahmen einer Online-Lösung. Aus Gründen der Verfahrensvereinfachung und –beschleunigung werden Sie gebeten, die entsprechenden Anträge online zu stellen.
|
|
||||||
Online-Zugang für Notare
|
|
||||||
Zur Identifikation ist es vorab jedoch erforderlich, dass Sie einmalig von der Stadt einen Benutzernamen und ein Passwort anfordern. Sie können dies schriftlich, per Fax (0209/169-4816) oder per E-Mail (Vorkaufsrechtsbescheinigung@gelsenkirchen.de) machen.
|
|
||||||
Für ortsfremde Notare und für den einmaligen Antrag eines Zeugnisses über die Nichtausübung bzw. das Nichtbestehen eines Vorkaufsrechts bei der Stadt Gelsenkirchen steht ein Formular zur Verfügung. Dieses ist an nebenstehende E-Mail-Adresse zusenden.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
Antrag des beurkundenden Notars möglichst in digitaler Form.
|
|
||||||
Gebühren
|
|
||||||
70,00€ je wirtschaftliche Einheit gemäß Gemeindeordnung NRW i.V.m. der Allgemeinen Gebührensatzung der Stadt Gelsenkirchen.
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
Überschrift: Anerkennung der Vaterschaft bei der standesamtlichen Anmeldung eines neugeborenen Kindes
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Sollen bei nicht verheirateten Kindeseltern die Angaben des Vaters sofort bei der Anmeldung in der Geburtsurkunde des Kindes vermerkt werden, ist zuvor die Abgabe einer Vaterschaftsanerkennung durch den Kindesvater notwendig; des weiteren ist eine Zustimmung der Kindesmutter zur Vaterschaftsanerkennung aufzunehmen. Hierzu bedarf es der persönlichen Vorsprache beider Elternteile. Zur Abgabe der Vaterschaftsanerkennung und der Zustimmungserklärung benötigen die Kindeseltern ein gültiges Ausweisdokument.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
|
|
||||||
Ausweisdokumente der Beteiligten (z. B. Personalausweis, Reisepass).
|
|
||||||
Zur anschließenden Beurkundung der Geburt des Kindes in dem standesamtlichen Geburtsregister werden auch die Geburtsurkunden der nicht verheirateten Kindeseltern benötigt.
|
|
||||||
Es ist eine vorherige telefonische Terminverinbarung nötig.
|
|
||||||
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
Überschrift: Teilungsgenehmigung
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Erteilung von Genehmigungen gemäß § 7 Landesbauordnung (BauO NRW) zur Teilung bebauter Grundstücke.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
Antrag gemäß Verordnung über bautechnische Prüfungen (BauprüfVO) NRW
|
|
||||||
Gebühren
|
|
||||||
Je gebildetes bebautes Grundstück zwischen 50,00€ und 500,00€ gemäß Gebührengesetz i.V.m. der Allgemeinen Verwaltungsgebührenordnung NRW.
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
Überschrift: Antrag zur Anerkennung einer ausländischer Entscheidung in Ehesachen
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
|
|
||||||
Anerkennung einer Ehescheidung eines deutschen Staatsangehörigen im Ausland
|
|
||||||
Anerkennung von Ehescheidungen, wenn diese nicht von dem jeweiligen Heimatstaat der beteiligten Ehegatten durchgeführt worden sind
|
|
||||||
|
|
||||||
Ausländische Scheidungsurteile müssen in Deutschland anerkannt werden.Nach den allgemeinen Grundsätzen des Staats- und Völkerrechts entfalten Urteile und vergleichbare Staatsakte grundsätzlich unmittelbare Rechtswirkungen nur im Gebiet des Staates, in dem sie erlassen worden sind. Jedem Staat steht es frei, ob und ggf. unter welchen Voraussetzungen er ausländische Hoheitsakte anerkennt, soweit er nicht durch Staatsverträge gebunden ist. Auch die Lösung des Ehebandes ist somit nach der Völkerrechtsgewohnheit zunächst nur in dem Staat wirksam, in dem sie vorgenommen wurde. Im deutschen Rechtsbereich gilt eine im Ausland gelöste Ehe weiterhin als bestehend ("hinkende Ehe"). Soll die Ehe auch für den deutschen Rechtsbereich wirksam gelöst sein, bedarf es der förmlichen Anerkennung. Gleiches gilt für die privatrechtliche Lösung des Ehebandes.
|
|
||||||
Grundlage der förmlichen Anerkennung einer ausländischen Entscheidung in Ehesachen bzw. eines vergleichbaren privatrechtlichen Aktes bildet seit dem 01.09.2009 § 107 FamFG. Zuvor richtete sich die Anerkennung nach Art. 7 § 1 FamRÄndG. Zuständig für die Anerkennungsentscheidung ist grundsätzlich die Justizverwaltung des Bundeslandes, in dem ein Ehegatte seinen gewöhnlichen Aufenthalt hat. Die Aufgaben der Landesjustizverwaltung sind für das Land Nordrhein-Westfalen der Präsidentin des Oberlandesgerichts Düsseldorf übertragen.
|
|
||||||
Die örtliche Zuständigkeit richtet sich nach dem Ort des Aufenthalts, wenn einer der Ehegatten der geschiedenen Ehe zum Zeitpunkt des Anerkennungsantrags seinen gewöhnlichen Aufenthalt im Bundesgebiet hat. Sofern keiner der Ehegatten seinen Aufenthalt im Bundesgebiet hat, aber in Deutschland eine neue Ehe geschlossen werden soll, richtet sich die örtliche Zuständigkeit nach dem Ort der geplanten Eheschließung. Hat keiner der Ehegatten der geschiedenen Ehe seinen Aufenthalt in Deutschland und soll auch hier keine neue Ehe geschlossen werden, ist die Zuständigkeit der Senatsverwaltung für Justiz in Berlin gegeben.
|
|
||||||
Die Entscheidung erfolgt nur auf Antrag. Antragsberechtigt ist neben den betroffenen Ehegatten jede Person, die ein rechtliches Interesse an der Klärung der Statusfrage glaubhaft macht (z.B. Verlobte, spätere Ehegatten oder Erben). Auch den Rentenversicherungsanstalten steht ein eigenes Antragsrecht zu. Dem Standesbeamten steht kein eigenständiges Antragsrecht zu. Ihm fehlt das rechtliche Interesse, wenn er die Anerkennung zur Eintragung der Scheidung in sein Register beantragt. Die Register sind, solange die ausländische Entscheidung nicht anerkannt ist und deshalb in der Bundesrepublik Deutschland keine Wirkung entfaltet, nicht unrichtig, wenn als Familienstand "verheiratet" eingetragen ist. Denn eine im Ausland geschiedene Person wird vor Anerkennung der ausländischen Ehescheidung in deutschen Personenstandsbüchern als "verheiratet" geführt.
|
|
||||||
Die Anerkennungs- wie auch die Nichtanerkennungsfeststellung der Landesjustizverwaltung bindet alle Gerichte und Behörden in Deutschland, § 107 Abs. 9 FamFG. Mit Anerkennung der ausländischen Ehescheidung gilt die Ehe auch für den deutschen Rechtsbereich rückwirkend auf den Zeitpunkt der ausländischen Lösung des Ehebandes als geschieden. Die Entscheidung der Landesjustizverwaltung nach § 107 FamFG erstreckt sich ausschließlich auf die Lösung des Ehebandes. Eventuelle in der ausländischen Entscheidung getroffene Regelungen zu Scheidungsfolgesachen werden nicht berührt. Scheidungsfolgesachen sind z.B. Regelungen zum Unterhalt, zum Sorgerecht und zum Versorgungsausgleich. Besteht insoweit ein Streit oder weiterer Regelungsbedarf, sind die Zivilgerichte zuständig.
|
|
||||||
Terminvergabe und weitere Informationen:
|
|
||||||
Da eine telefonsche Ereichbarkeit aufgrund von Sachbearbeitung nur eingeschränkt gegeben ist, schreiben Sie uns bitte eine Mail mit Ihrem Anliegen und Ihrer Rufnummer. Wir melden uns bei Ihnen zwecks einer Terminvereinbarung.
|
|
||||||
Haben Sie noch Fragen hierzu? Auch hier schreiben Sie bitte eine Mail mit Ihrer Rufnummer und der Bitte um Rückruf.
|
|
||||||
Voraussetzungen
|
|
||||||
|
|
||||||
Dokumente sind in der jeweiligen Originalausfertigung mit deutscher Übersetzung einzureichen
|
|
||||||
Übersetzungen ausländischer Dokumente sind von einem von der deutschen Landesjustizverwaltung ermächtigten Übersetzer vorzunehmen
|
|
||||||
Sollte der Antragsteller der deutschen Sprache nicht hinreichend kundig sein, ist das Hinzuziehen eines Übersetzers notwendig, der nicht mit den Erklärenden verwandt ist und sich durch ein gültiges Ausweisdokument (z.B. Personalausweis oder Reisepass) ausweisen kann.
|
|
||||||
|
|
||||||
|
|
||||||
Benötigte Unterlagen
|
|
||||||
Zur Anerkennung einer ausländischen Entscheidung in Ehesachen (Ehescheidung) werden bei der Antragstellung durch das Standesamt nachfolgend aufgeführte Unterlagen benötigt:
|
|
||||||
|
|
||||||
Vollständige Ausfertigung des Scheidungsurteils mit Rechtskraftnachweis (Originalausfertigung mit vollständiger Übersetzung),
|
|
||||||
Heiratsurkunde der aufgelösten Ehe (Originalausfertigung in der Landessprache mit deutscher Übersetzung oder mehrsprachige Ausfertigung),
|
|
||||||
Einbürgerungsurkunde, sofern der Antrag stellende Ehegatte die deutsche Staatsangehörigkeit durch Einbürgerung erlangt hat,
|
|
||||||
Personalausweis oder Reisepass des Antragstellers,
|
|
||||||
Verdienstnachweis,
|
|
||||||
postzustellungsfähige Anschrift des geschiedenen Ehegatten.Die Übersetzungen sämtlicher fremdsprachiger Personenstandsurkunden und Schriftstücke sind von einem von der deutschen Landesjustizverwaltung ermächtigten Übersetzer zu fertigen.Nach Prüfung des Sachverhalts durch das Oberlandesgericht kann die Vorlage weiterer Unterlagen notwendig sein.
|
|
||||||
|
|
||||||
Gebühren
|
|
||||||
Für die Entscheidung entsteht abhängig vom Einkommen der Antragsteller eine Gebühr zwischen 10,- EURO und 305,- EURO (§ 4 JVKostG). Für die Rücknahme eines Antrages wird die Hälfte der für die Entscheidung fälligen Gebühr - jedoch mindestens 10,- EURO - erhoben (§ 4 Abs. 2 JVKostG).
|
|
||||||
Die Entscheidung hinsichtlich der Anerkennung der Ehescheidung obliegt dem Oberlandesgericht Düsseldorf.
|
|
||||||
Der Antrag muss nicht durch den Standesbeamten gestellt werden. Er kann dem Oberlandesgericht auch unmittelbar zugesandt werden. Es empfiehlt sich jedoch, wegen der beizufügenden Dokumente, die Beratung durch den Standesbeamten in Anspruch zu nehmen. Zur Antragstellung unter Mithilfe des Standesbeamten vereinbaren Sie bitte einen Besuchstermin.Für die Mithilfe bei der Erstellung des Antrages durch das Standesamt wird eine weitere Gebühr in Höhe von 75,00 € erhoben.
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
Überschrift: Erlaubnis zur Führung einer Berufsbezeichnung der nichtakademischen Heilberufe
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Die Ausbildung an den entsprechenden staatlich anerkannten Gelsenkirchener Schulen endet mit erfolgreichem Ablegen einer staatlichen Abschlussprüfung. Mit Ablauf der Ausbildung kann auf Antrag die entsprechende Berufserlaubnis erteilt werde. Ausnahme: Rettungsassistenten/innen haben nach der Prüfung das vorgeschriebene Praktikum nachzuweisen.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
|
|
||||||
beglaubigte Kopie des Abschlusszeugnisses
|
|
||||||
Führungszeugnis Belegart "0"
|
|
||||||
ärztliches Attest über die gesundheitliche Eignung zur Ausübung des Berufes
|
|
||||||
beglaubigte Kopie einer Personenstandsurkunde.
|
|
||||||
|
|
||||||
Gebühren
|
|
||||||
60,00 €
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
Überschrift: Hilfen für Menschen mit psychischen Störungen, Epilepsien und/ oder mentalen Behinderungen
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Der Sozialpsychiatrische Dienst ist erste Anlaufstelle für Menschen mit psychischen Störungen, Epilepsien und/oder mentalen Behinderungen und bietet ein vielfältiges Angebot an Hilfen für die betroffenen Menschen und deren Angehörige und Freunde an:
|
|
||||||
|
|
||||||
Information und Beratung zu mentalen Behinderungen und/oder psychischen Störungen
|
|
||||||
Abklärung des gesundheitlichen und sozialen Hilfebedarfs betroffener Menschen und ihrer Angehörigen
|
|
||||||
Vermittlung in medizinische, soziale, aufsuchende, ambulante und stationäre und pflegerische Hilfen, z.B. Vermittlung in Ambulant Betreutes Wohnen, in Kliniken und zu Fachärzten, in ambulant psychiatrische Pflege
|
|
||||||
kontinuierliche, begleitende Hilfen
|
|
||||||
psychiatrische Notfallversorgung und Hilfen bei Krisen
|
|
||||||
regelmäßige Sprechstunden
|
|
||||||
Videoberatungen
|
|
||||||
Beratung und Unterstützung, auch in häuslicher Umgebung
|
|
||||||
|
|
||||||
Voraussetzungen
|
|
||||||
Besondere Vorleistungen müssen nicht erbracht werden.Mit unseren Mitarbeitern und Mitarbeiterinnen können Sie Gesprächstermine und gegebenenfalls Hausbesuche vereinbaren.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
keine
|
|
||||||
Gebühren
|
|
||||||
Unser Angebot ist kostenfrei.
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
Überschrift: Hilfen für Menschen mit Suchterkrankungen
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Der Sozialpsychiatrische Dienst ist erste Anlaufstelle für Menschen mit Suchterkrankungen und bietet ein vielfältiges Angebot an Hilfen für die betroffenen Menschen und deren Angehörige und Freunde an:
|
|
||||||
|
|
||||||
Information und Beratung zu Stoffen, zur Suchterkrankung und zu Suchtverhalten
|
|
||||||
Abklärung des gesundheitlichen und sozialen Hilfebedarfs der betroffenen Menschen und ihrer Angehörigen
|
|
||||||
kontinuierliche, begleitende Hilfen
|
|
||||||
suchtpsychiatrische Notfallversorgung und Hilfen bei Krisen
|
|
||||||
regelmäßige offene Sprechstunden
|
|
||||||
Beratung und Unterstützung, auch in häuslicher Umgebung
|
|
||||||
Vermittlung in medizinische, soziale, aufsuchende, ambulante, stationäre und pflegerische Hilfen, z.B. Vermittlung in Ambulant Betreutes Wohnen, in Kliniken und zu Fachärzten, in Entwöhnungseinrichtungen
|
|
||||||
Erstellung von amtsärztlichen Gutachten
|
|
||||||
Dem Dienst angegliedert ist eine Methadonambulanz, in der Opiatsubstitution mit Polamidon/Methadon und Psychosoziale Betreuung (PSB) durchgeführt werden(s. Methadonambulanz des Sozialpsychiatrischen Dienstes).
|
|
||||||
|
|
||||||
Wir bieten Kontinuität, Zuverlässigkeit und Verschwiegenheit.
|
|
||||||
Voraussetzungen
|
|
||||||
Besondere Vorleistungen müssen nicht erbracht werden.Mit unseren Mitarbeitern und Mitarbeiterinnen können Sie Gesprächstermine und gegebenenfalls Hausbesuche vereinbaren.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
keine
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
Überschrift: Begrüßungshausbesuche bei erstgeborenen Kindern
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Einige Wochen nach der Geburt Ihres ersten Kindes erhalten Sie von der Familienförderung/ Familienbildung das Angebot, eines Begrüßungshausbesuches. In diesem Hausbesuch erhalten Sie wertvolle Informationen rund um das Baby. Weiterhin geben wir Ihnen Auskunft über Angebote für Familien in Ihrer Nähe. Kleine Geschenke sind in der Begrüßungstasche vorhanden, die alle besuchten Eltern von uns erhalten.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
keine
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
Überschrift: Denkmalrechtliche Erlaubnis
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Wer ein Baudenkmal oder einen Teil eines Baudenkmals beseitigen, verändern, an einen anderen Ort verbringen oder dessen bisherige Nutzung ändern will, bedarf der Erlaubnis der Unteren Denkmalbehörde. Der Erlaubnis bedarf auch, wer in der engeren Umgebung eines Baudenkmals Anlagen errichten, verändern oder beseitigen will, wenn sich dies auf die denkmalwerte Substanz oder das Erscheinungsbild des Baudenkmals auswirken kann. (§ 9 Abs. 1 und 2 Denkmalschutzgesetz NRW)
|
|
||||||
Instandsetzungsarbeiten bedürfen keiner Genehmigung, wenn sie sich nur auf Teile des Denkmals auswirken, die für seinen Denkmalwert ohne Bedeutung sind. Aber Achtung: Die Entscheidung, ob eine Maßnahme genehmigungsfrei ist, obliegt der Unteren Denkmalbehörde und ist mit dieser abzustimmen.
|
|
||||||
Die Abstimmung mit der zuständigen Denkmalbehörde ist auch Voraussetzung zur steuerlichen Absetzung einer Maßnahme.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
Antrag in dreifacher Ausführung (Formular § 9 DSchG NRW, ggf. Anlagen wie Baupläne oder Fotos).
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
Überschrift: Förderung nach dem Denkmalschutzgesetz
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Die Förderung erfolgt in Form von Zuschüssen und Darlehen.
|
|
||||||
Voraussetzungen
|
|
||||||
Eintragung des Objektes in die Denkmalliste und vorliegende oder beantragte Erlaubnis gemäß § 9 DSchG NRW.
|
|
||||||
Antragstellung
|
|
||||||
Nach § 35 Denkmalschutzgesetz NRW in Verbindung mit den aktuellen Förderrichtlinien Denkmalpflege können aus Mitteln des Landes Nordrhein-Westfalen über die Bezirksregierung Münster Zuschüsse gewährt werden. Der Antrag ist in zweifacher Ausfertigung über die Untere Denkmalbehörde bei der Bezirksregierung Münster einzureichen. Diese Anträge sind bis spätestens zum 15.07. eines Jahres für das darauffolgende Jahr bei der Unteren Denkmalbehörde zur Abstimmung vorzulegen, damit die Frist zur Vorlage bei der Bezirksregierung Münster eingehalten werden kann.
|
|
||||||
Auch von der NRW-Bank und KFW-Bank werden Förderprogramme für Vorhaben zur Instandhaltung und Sanierung von Baudenkmälern und Gebäuden mit besonders erhaltenswerter Bausubstanz angeboten.
|
|
||||||
Eine indirekte Förderung ist in Form von steuerlichen Vergünstigungen und Steuerbescheinigungen bei Denkmälern möglich – unter Berücksichtigung der Bestimmungen des Denkmalschutzgesetzes in Verbindung mit den aktuellen Bescheinigungsrichtlinien zur Anwendung der §§ 7i, 10f und 11b des Einkommensteuergesetzes. Die Ausstellung einer Bescheinigung für steuerliche Zwecke ist unter Beifügung aller Rechnungen und sonstigen Belege über die durchgeführten Arbeiten an dem Denkmal schriftlich zu beantragen.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
Antrag in dreifacher Ausführung (Formular § 35 DSchG NRW, Kopie der Eintragung in die Denkmalliste, Kopie der Erlaubnis gemäß § 9 DSchG NRW bzw. Baugenehmigung, Lageplan, Entwurfs- oder Bauzeichnungen und Fotos, Auszug aus der Flurkarte, Kostenermittlung (Kostenschätzung), ggf. aufgegliedert in Kostengruppen nach DIN 276, Stellungnahme des Kreises (Finanzaufsicht) bei Maßnahmen von kreisangehörigen Gemeinden.
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
Überschrift: Vertriebenenangelegenheiten
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Ausstellung von Zweitschriften von Spätaussiedlerbescheinigungen und Vertriebenenausweisen.
|
|
||||||
Bitte vereinbaren Sie telefonisch einen Termin unter der Telefonnummer 169 2454.
|
|
||||||
Voraussetzungen
|
|
||||||
|
|
||||||
Besitz der Vertriebeneneigenschaft nach dem Bundesvertriebenengesetz.
|
|
||||||
|
|
||||||
Benötigte Unterlagen
|
|
||||||
|
|
||||||
Bundespersonalausweis
|
|
||||||
|
|
||||||
Gebühren
|
|
||||||
|
|
||||||
10,00€
|
|
||||||
gebührenfrei für Rentenzwecke
|
|
||||||
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
Überschrift: Eheschließung - Ehefähigkeitszeugnis, Informationen Eheschließung im Ausland
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Auch im Ausland geschlossene Ehen werden grundsätzlich anerkannt, wenn die Trauung in der für das jeweilige Land üblichen und vorgeschriebenen Form von den zuständigen Stellen durchgeführt worden ist. Sie sollten sich rechtzeitig informieren, welche Papiere Sie für Ihre Eheschließung im Ausland benötigen. Auskünfte können Ihnen die deutschen Konsulate in dem jeweiligen Staat, aber auch die Botschaft des betreffenden Landes in der Bundesrepublik geben.
|
|
||||||
Manche Staaten fordern von Ihnen ein "Ehefähigkeitszeugnis", das Ihnen von dem zuständigen Standesamt Ihres Wohnsitzes ausgestellt werden kann.
|
|
||||||
Nach der erfolgten Eheschließung sollten Sie Ihre ausländische Heiratsurkunde möglichst durch die zuständigen Behörden des jeweiligen Staates beglaubigen (Apostille) oder ggf. durch die zuständige deutsche Botschaft im Ausland legalisieren lassen (Legalisation).
|
|
||||||
Da im Ausland häufig nicht die im deutschen Namensrecht vorgesehenen Namenswahlmöglichkeiten gegeben sind, sollten Sie nach Ihrer Rückkehr in die Bundesrepublik mit Ihrer Heiratsurkunde beim Standesamt vorsprechen um zunächst prüfen zu lassen, ob für Sie als deutsche/r Staatsangehörige/r die in Ihrer Heiratsurkunde vermerkte Namenswahl auch in der Bundesrepublik wirksam ist. Ggf. kann auch nachträglich bei dem hiesigen Standesamt von den Ehegatten eine gemeinsame Namenserklärung abgegeben werden.
|
|
||||||
Es besteht auch die Möglichkeit, eine im Ausland geschlossene Ehe auf Antrag im Eheregister beurkunden zu lassen.
|
|
||||||
Eine vorherige telefonische Rücksprache mit der zuständigen Standesbeamtin/dem Standesbeamten ist zu empfehlen.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
Für eine Eheschließung im AuslandBitte informieren Sie sich bei der Botschaft des betreffenden Landes oder einem deutschen Konsulat im jeweiligen Staat, welche Unterlagen Sie benötigen.
|
|
||||||
Falls Sie eine Namenserklärung und/oder einen Antrag auf Beurkundung im Eheregister abgeben wollen, klären Sie bitte zuvor telefonisch mit uns, welche Unterlagen Sie mitbringen müssen.
|
|
||||||
Gebühren
|
|
||||||
Ehefähigkeitszeugnis
|
|
||||||
|
|
||||||
100,00 €
|
|
||||||
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
Überschrift: Eheschließung - Möglichkeiten der Namensführung
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Sie können bei der Eheschließung einen gemeinsamen Ehenamen bestimmen. Zum Ehenamen kann der Geburtsname oder der zum Zeitpunkt der Eheschließung geführte Name der Frau oder des Mannes bestimmt werden. Die Ehenamensbestimmung muss aber nicht bei der Eheschließung erfolgen, sondern kann ohne jede Frist auch zu einem späteren Zeitpunkt vorgenommen werden. Wenn Sie sich allerdings für einen Ehenamen entschieden haben, ist diese Ehenamensbestimmung in der bestehenden Ehe unwiderruflich.
|
|
||||||
Wenn Sie keinen gemeinsamen Ehenamen bestimmen möchten, verbleibt es bei getrennter Namensführung, d.h., Sie führen beide den Familiennamen weiter, den Sie bei Eingang der Ehe tragen.
|
|
||||||
Bei der Geburt eines Kindes müssten Sie dann jedoch gemeinsam entscheiden, welchen Familiennamen das Kind führen soll. Diese Entscheidung gilt auch für weitere gemeinsame Kinder. Die Führung eines Doppelnamens für Kinder, der sich aus den Geburtsnamen der Eltern bildet, ist leider nicht möglich.
|
|
||||||
Sofern Sie sich für einen Ehenamen entscheiden, kann der Ehegatte, dessen Name nicht Ehename geworden ist, diesen Namen dem Ehenamen voranstellen oder anfügen, d.h., dass nur dieser Ehegatte einen Doppelnamen führen kann. Der andere Ehegatte führt weiterhin den von beiden Ehegatten bestimmten Ehenamen. Die Bestimmung eines Doppelnamens für beide Ehegatten lässt das deutsche Namensrecht nicht zu.
|
|
||||||
Haben Sie noch weitere Fragen? Rufen Sie uns an. Die Standesbeamtinnen und Standesbeamten des Standesamtes Gelsenkirchen helfen Ihnen gern weiter.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
keine
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
Überschrift: Elektronischer Aufenthaltstitel (eAT), Aushändigung
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Sie haben einen eAT beantragt und wollen wissen, wann Sie diesen abholen können?
|
|
||||||
Die Produktion eines neuen Titels bei der Bundesdruckerei GmbH dauert in der Regel vier bis sechs Wochen. Nach Fertigstellung Ihres eAT erhalten Sie von der Bundesdruckerei GmbH einen sogenannten PIN-Brief. Eine Abholung des Titels ist zu diesem Zeitpunkt jedoch noch nicht möglich. Warten Sie bitte, bis Sie dazu gesondert von der Ausländerbehörde informiert werden. Sollten Sie drei Wochen nach Erhalt des PIN-Briefes keine Mitteilung der Ausländerbehörde bekommen haben, sprechen Sie bitte an den Walk-In-Schaltern der Ausländerbehörde vor.
|
|
||||||
Voraussetzungen
|
|
||||||
Zur Aushändigung des eAT ist eine zusätzliche Vorsprache erforderlich. Hierzu kann auch eine dritte Person bevollmächtigt werden. Nutzen Sie dazu bitte ausschliesslich das hier zum Download angebotene Formular.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
|
|
||||||
gültiger Nationalpass
|
|
||||||
bei Übertragung des Aufenthaltstitels ggfs. der bisherige Nationalpass
|
|
||||||
ggfs. Vollmacht
|
|
||||||
|
|
||||||
Gebühren
|
|
||||||
Sofern Sie bereits bei der Antragstellung die erforderliche Verwaltungsgebühr vollständig entrichtet haben, fallen keine weiteren Gebühren an.
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
Überschrift: Vaterschaftsanerkennung/Vaterschaftsfeststellung
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Bei nicht miteinander verheirateten Eltern besteht eine Vaterschaft erst dann, wenn sie urkundlich anerkannt oder gerichtlich festgestellt ist. Die Beurkundung der Vaterschaftsanerkennung und Zustimmung der Kindesmutter kann u. a. bei der Beistandschaft des Jugendamtes Gelsenkirchen nach Terminvereinbarung vorgenommen werden. Die Anerkennung kann auch schon vor Geburt des Kindes erfolgen.
|
|
||||||
Wenn eine freiwillige Vaterschaftsanerkennung nicht erreicht werden kann, kann im Rahmen einer Beistandschaft ein gerichtliches Verfahren eingeleitet werden.
|
|
||||||
Voraussetzungen
|
|
||||||
Die Mutter ist bei der Geburt des Kindes nicht verheiratet.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
|
|
||||||
Gültige Ausweispapiere
|
|
||||||
Geburtsurkunde des Kindes
|
|
||||||
Mutterpass, bei Beurkundung vor Geburt des Kindes
|
|
||||||
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
Überschrift: Beurkundungen
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Beim Jugendamt können u. a. folgende Beurkundungen vorgenommen werden:
|
|
||||||
|
|
||||||
I. Vaterschaftsanerkennung mit den erforderlichen Zustimmungen
|
|
||||||
II. Unterhaltsverpflichtungserklärung
|
|
||||||
III. Gemeinsame Sorgeerklärung der Eltern
|
|
||||||
|
|
||||||
Voraussetzungen
|
|
||||||
|
|
||||||
Zu I. Die Mutter ist bei der Geburt des Kindes nicht verheiratet.
|
|
||||||
Zu II. Die Höhe des Unterhaltes ist berechnet (z. B. durch Anwalt / Beistand).
|
|
||||||
Zu III. Die Sorgeerklärung setzt das rechtswirksame Bestehen der Vaterschaft voraus.
|
|
||||||
|
|
||||||
Beurkundungen der Vaterschaftsanerkennung und der gemeinsamen Sorgeerklärung sind auch bereits vor Geburt des Kindes möglich.
|
|
||||||
Bitte beachten Sie, dass Beurkundungen nur nach Terminvereinbarung erfolgen.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
|
|
||||||
Gültige Ausweispapiere
|
|
||||||
Geburtsurkunde des Kindes
|
|
||||||
Mutterpass, bei Beurkundung vor Geburt des Kindes
|
|
||||||
Bei Unterhaltsbeurkundungen gegebenenfalls abzuändernde Unterhaltvereinbarungen, Aufforderungsschreiben von Anwälten oder Beiständen
|
|
||||||
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
Überschrift: Auskunft aus dem Sorgeregister (vormals Negativbescheinigung)
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Die Pflicht und das Recht für ein Kind zu sorgen (elterliche Sorge) haben verheiratete Eltern gemeinsam. Bei nicht verheirateten Eltern hat kraft Gesetzes die Kindesmutter das alleinige Sorgerecht. Sie kann dies durch Vorlage einer Auskunft aus dem Sorgeregister nachweisen. Hierin wird vom Wohnortjugendamt bestätigt, dass zum Zeitpunkt der Ausstellung dieser Bescheinigung beim Geburtsjugendamt keine übereinstimmenden Sorgeerklärungen der Eltern des Kindes vorliegen.
|
|
||||||
Voraussetzungen
|
|
||||||
|
|
||||||
Es wurde weder eine gerichtliche Sorgeregelung getroffen, noch eine Sorgerklärung der Eltern beurkundet.
|
|
||||||
Wohnsitz in Gelsenkirchen
|
|
||||||
|
|
||||||
Benötigte Unterlagen
|
|
||||||
gültige Ausweispapiere
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
Überschrift: Gewerbeauskunft online
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Die Gewerbeauskunft online ermöglicht jedermann den schnellen Zugriff auf datenschutzrechtlich unbedenkliche Daten wie Name, betriebliche Anschrift und angezeigte Tätigkeit derjenigen Gewerbetreibenden, die aktuell in Gelsenkirchen gewerberechtlich angemeldet sind. Die Auskünfte sind gebührenfrei; eine Anmeldung ist dafür nicht erforderlich.Bitte beachten Sie:Das Gewerberegister enthält nur selbständige Gewerbetreibende im Sinne der Gewerbeordnung. Nicht enthalten sind insbesondere Selbständige, die eine freiberufliche Tätigkeit ausüben, z. B. Ärztinnen und Ärzte, Architektinnen und Architekten, Anwältinnen und Anwälte sowie Steuerberaterinnen und Steuerberater. Dasselbe gilt für Heilhilfsberufe, z. B. Krankenpflegerinnen und Krankenpfleger, Physiotherapeutinnen und Physiotherapeuten, Heilpraktikerinnen und Heilpraktiker sowie Geburtshelferinnen und Geburtshelfer.
|
|
||||||
Hier gehts zur Gewerbeauskunft: migewa eAuskunft
|
|
||||||
Weitere Gewerbedaten:Behörden und andere öffentliche Stellen können als registrierte Nutzer weitere Daten aus dem Gewerberegister erhalten. Bitte senden Sie den Registrierungsantrag vollständig ausgefüllt und unterschrieben an:
|
|
||||||
Stadt Gelsenkirchen32/5 - Gewerbe Bochumer Str. 12-1645875 Gelsenkirchen
|
|
||||||
Bei Vorliegen der Voraussetzungen für die Erteilung von Auskünften nach § 14 Gewerbeordnung werden die Zugangsdaten zeitnah übermittelt.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
keine
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
Überschrift: Geräte ausleihen
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Das Medienzentrum bietet einen umfangreichen Bestand an Technik für Veranstaltungen und die pädagogische Arbeit mit Medien.
|
|
||||||
Voraussetzungen
|
|
||||||
Wer darf ausleihen?
|
|
||||||
Schulen, Kindergärten, städtische Referate, eingetragene Vereine und andere öffentliche Einrichtungen
|
|
||||||
Ausleihfrist: nach AbspracheTerminabsprache: Herr Petrovitsch, Telefon 0209/169-3028Abholung erfolgt in der Kinderbibliothek im Bildungszentrum, Ebertstraße 19, 45879 Gelsenkirchen
|
|
||||||
Benötigte Unterlagen
|
|
||||||
|
|
||||||
Personalausweis des Abholenden
|
|
||||||
das ausgefüllte und von der ausleihenden Institution unterschriebene Ausleihformular
|
|
||||||
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
Überschrift: Historische Fotos
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Die fotografische Überlieferung im Institut für Stadtgeschichte liegt in verschiedenen Beständen vor. Darunter befinden sich unter anderem die Nachlässe der Pressefotografen Alfons Kampert, Kurt Müller und Theo Weingandt (ca. 50.000 Einheiten), der überlieferte Fotobestand des Presseamtes der Stadt Gelsenkirchen sowie fotografische Sammlungen von Privatleuten und öffentlichen Einrichtungen.
|
|
||||||
Der Schwerpunkt der fotografischen Dokumentation von Stadtgeschichte liegt im Zeitraum von 1946 bis 1999.
|
|
||||||
Voraussetzungen
|
|
||||||
Die Anfertigung von Kopien auf digitalen Speichermedien kann schriftlich angefragt werden mit Zusicherung der Kostenübernahme.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
keine
|
|
||||||
Gebühren
|
|
||||||
Die Anfertigung von Benutzungskopien ist gebührenpflichtig und in der Gebührenordnung des Instituts für Stadtgeschichte vom 29. März 2012 festgelegt.
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
Überschrift: Ferienkindergarten
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Falls Bedarf für einen Kindergartenplatz in der betreuungsfreien Zeit besteht, haben Sie die Möglichkeit Ihr Kind in einem unserer Ferienkindergärten anzumelden.
|
|
||||||
Voraussetzungen
|
|
||||||
Ihre Anmeldung muss spätestens drei Monate vor Beginn der Betriebsferien bei uns eingegangen sein.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
Bedarfsanzeige
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
Überschrift: Fernleihe
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Medien, die nicht in der Stadtbibliothek Gelsenkirchen vorhanden sind, können aus anderen Bibliotheken bestellt werden.
|
|
||||||
Über die Fernleihe kann folgendes bestellt werden:
|
|
||||||
|
|
||||||
Bücher
|
|
||||||
Noten
|
|
||||||
Aufsätze aus Zeitschriften
|
|
||||||
Artikel aus Zeitungen
|
|
||||||
Dissertationen
|
|
||||||
Audiovisuelle Medien.
|
|
||||||
|
|
||||||
Nicht beschafft werden:
|
|
||||||
|
|
||||||
Medien, die im Buchhandel für weniger als 15 Euro erhältlich sind
|
|
||||||
Diplom-, Magister- und Examensarbeiten
|
|
||||||
Schul- und Berufsschulbücher
|
|
||||||
Loseblattausgaben.
|
|
||||||
|
|
||||||
Sie werden benachrichtigt, sobald das bestellte Medium eingetroffen ist. Eine Verlängerung der Ausleihfrist ist unter Vorbehalt möglich.
|
|
||||||
Voraussetzungen
|
|
||||||
|
|
||||||
Gültiger Bibliotheksausweis der Stadtbibliothek Gelsenkirchen
|
|
||||||
Bei mehrbändigen Werken: eine Bestellung pro Band erforderlich.
|
|
||||||
Eventuelle Einschränkungen der verleihenden Bibliotheken sind zu beachten!
|
|
||||||
|
|
||||||
Benötigte Unterlagen
|
|
||||||
keine
|
|
||||||
Gebühren
|
|
||||||
Der Fernleihservice kostet 2 Euro pro Medium oder Zeitschriftenaufsatz (Kopie bis 20 Seiten Umfang).
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
Überschrift: Steuerbescheinigung bei Denkmälern
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Bescheinigungen für die Erlangung von Steuervergünstigungen werden von der Unteren Denkmalbehörde ausgestellt. Sie dürfen nur erteilt werden, wenn das Denkmal in die Denkmalliste eingetragen ist oder gemäß § 4 Abs. 1 und 2 als vorläufig eingetragen gilt.
|
|
||||||
Voraussetzungen
|
|
||||||
Abgeschlossenes Erlaubnisverfahren gemäß § 9 DSchG NRW einschließlich der schriftlichen Zusicherung der Bescheinigungsfähigkeit der Maßnahme.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
Antrag in dreifacher Ausführung (Formular § 36 DSchG NRW, Originalrechnungen, Zahlungsbelege).
|
|
||||||
Gebühren
|
|
||||||
Die Erteilung einer Bescheinigung nach § 36 DSchG NRW ist gebührenpflichtig.
|
|
||||||
Gemäß der Allgemeinen Verwaltungsgebührenordnung in der derzeit geltenden Fassung beträgt die Gebühr für die Erteilung einer Steuerbescheinigung zwischen 20,00 und 100,00 Euro.
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
Überschrift: Unterschutzstellung von Denkmälern
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Die Denkmalliste wird von der Unteren Denkmalbehörde geführt. Die Eintragung erfolgt nach Anhörung des zuständigen Landschaftsverbandes von Amts wegen, auf Anregung des Eigentümers oder Antrag des Landschaftsverbandes.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
Formloses Schreiben mit Bitte zur Prüfung des Denkmalwertes gemäß §2 und § 4 DSchG NRW.
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
Überschrift: Fachliche Beratung im Denkmalschutz
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Bei der Unteren Denkmalbehörde erhalten Sie fachliche Beratung zur Sanierung und Restaurierung von Denkmälern.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
keine
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
Überschrift: Auszug aus der Liegenschaftskarte
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Die Liegenschaftskarte - auch Katasterkarte oder Flurkarte genannt - ist eine maßstäbliche Darstellung aller Liegenschaften (Flurstücke und Gebäude). Ein Auszug aus der Liegenschaftskarte wird immer dann benötigt, wenn Gebäude oder Grundstücke ge- bzw. verkauft, beplant oder belastet werden sollen.
|
|
||||||
Sie können eine Liegenschaftskarte über den unten angefügten Antrag (Antrag_Kasterauskunft.pdf) anfordern. Senden Sie dafür bitte den ausgefüllten Antrag per e-Mail an die Adresse katasterauskunft@gelsenkirchen.de.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
keine
|
|
||||||
Gebühren
|
|
||||||
Nach VermWertKostO NRW, Tarifstelle 3.2
|
|
||||||
Gebühr je Liegenschaftskarte bis DIN A3 30,00 €, DIN A2 bis DIN A0 60,00 €
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
Überschrift: Bestandsnachweis aus dem Liegenschaftskataster
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Der Bestandsnachweis umfasst alle Grundstücke die auf demselben Grundbuchblatt stehen. Er beinhaltet zu allen Grundstücken eines Bestandes, Angaben aus dem Liegenschaftskataster zur Fläche, Lage, tatsächlichen Nutzung, Angaben zur Bodenschätzung sowie nachrichtlich geführte Eigentumsangaben aus dem Grundbuch.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
keine
|
|
||||||
Gebühren
|
|
||||||
Nach VermWertKostO NRW, Tarifstelle 3.2, Gebühr je Bestandsnachweis 30,00 €
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
Überschrift: Nachtarbeitserlaubnis bei Veranstaltungen
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Sofern Sie beabsichtigen, im Rahmen einer öffentlichen Veranstaltung Aufbau- und Abbauarbeiten innerhalb der gesetzlich geschützten Nachtruhe (22:00 Uhr bis 06:00 Uhr) durchzuführen, benötigen Sie eine Ausnahmeerlaubnis zur Nachtarbeit.
|
|
||||||
Voraussetzungen
|
|
||||||
Die Aufbau- und Abbauarbeiten können aus besonderen Gründen nicht außerhalb der Nachtruhe erfolgen.
|
|
||||||
Ihren Antrag auf Erteilung einer Ausnahmeerlaubnis zur Nachtarbeit sollten Sie mindestens 4 Wochen vor Beginn Ihrer Veranstaltung einreichen.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
Schriftlicher Antrag..
|
|
||||||
Verwenden Sie bitte den Download "Nachtarbeitsantrag_Veranstaltungen"
|
|
||||||
Gebühren
|
|
||||||
10,00 Euro bis 1.000,00 Euro
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
Überschrift: Kulturrucksack
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Gelsenkirchen ist zusammen mit Herten in interkommunaler Zusammenarbeit als eine von 28 Pilotkommunen im Rahmen des Landesprogramms Kulturrucksack NRW ausgewählt worden. Das Projekt startete 2012 und ist auf vier Jahre angelegt. Es richtet sich an junge Menschen im Alter von 10 bis 14 Jahren.
|
|
||||||
Für beide Städte ist die kulturelle Chancengleichheit für alle Kinder und Jugendlichen ein wichtiges und verbindendes Thema. Auf Basis einer Chancen-Defizit-Analyse sollen Best-Practise-Beispiele entwickelt werden, die die Teilhabe am kulturellen Leben verbessern und neue Orte und Themenfelder erschließen. Angedacht sind in diesem Zusammenhang Workshops und Projekte zu eigene Identität / Familie und Umgebung / Wohnort. 2012 wurde der Spartenschwerpunkt Tanz, Theater, Performance gewählt. Während Gelsenkirchen städtische Kultureinrichtungen einbringen konnte, setzte Herten auf freie Kulturinitiativen. Die Kinder und Jugendlichen haben gemeinsam in ihrer Heimat- und Nachbarstadt neue, abwechslungsreiche Angebote kennengelernt.
|
|
||||||
In Gelsenkirchen leben 12.935, in Herten 3.132 Kinder und Jugendliche im Alter zwischen 10 und 14 Jahren
|
|
||||||
Voraussetzungen
|
|
||||||
Die Teilnehmenden müssen 10 bis 14 Jahre alt sein.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
keine
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
Überschrift: nachtfrequenz
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Beratung und Unterstützung bei der Teilname am landesweiten Festival.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
Aussagekräftiges Konzept.
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
Überschrift: Vereinbarung von Sonderterminen zum Besuch der Sammlung Werner Thiel
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Außerhalb der generellen Öffnungszeiten (samstag und sonntags von 11:00 bis 18:00 Uhr) Öffnung der Ausstellung
|
|
||||||
Benötigte Unterlagen
|
|
||||||
keine
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
Überschrift: Kulturstrolche
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Ein Programm für Zweitklässler.
|
|
||||||
Die Kulturstrolche der Stadt machen sich in Zukunft auf den Weg, unterschiedliche Kultureinrichtungen in Gelsenkirchen kennen zu lernen. Zu diesen Kultureinrichtungen zählen das Institut für Stadtgeschichte, der Kulturraum "die flora", das Kunstmuseum, die Stadtbibliothek, die Städtische Musikschule, das Consol Theater und die Kunstschule Gelsenkirchen e.V.
|
|
||||||
Voraussetzungen
|
|
||||||
Anmeldung.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
keine
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
Überschrift: Führung und museumspädagogisches Programm im Kunstmuseum
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Regelmäßig werden offene Führungen durch das Kunstmuseum im Ganzen oder durch Teilbereiche angeboten. Besondere museumspädagogische Angebote sind Schulklassen- und Kindergartenführungen, Seniorennachmittage, das Programm "Mit Oma und Opa ins Museum" sowie Ferienprogramme.
|
|
||||||
Darüber hinaus können geschlossene Führungen verabredet werden.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
keine
|
|
||||||
Gebühren
|
|
||||||
Bei geschlossen Führungen nach Vereinbarung.
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
Überschrift: Musikunterricht
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Die Städtische Musikschule Gelsenkirchen bietet für Kinder und Jugendliche verschiedene Alters zahlreiche Angebote an. Im Einzelnen siehe detaillierte Informationen zum Musikunterricht .
|
|
||||||
Benötigte Unterlagen
|
|
||||||
keine
|
|
||||||
Gebühren
|
|
||||||
Es besteht eine Gebührenordnung.
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
Überschrift: Flurstücks- und Eigentümernachweis aus dem Liegenschaftskataster
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Der Flurstücks- und Eigentümernachweis beinhaltet für ein Flurstück, Angaben aus dem Liegenschaftskataster zur Fläche, Lage, tatsächlichen Nutzung, Angaben zur Bodenschätzung sowie nachrichtlich geführte Eigentumsangaben aus dem Grundbuch.
|
|
||||||
Sie können einen Flurstücks- und Eigentümernachweis über den unten angefügten Antrag (Antrag_Kasterauskunft.pdf) anfordern. Senden Sie dafür bitte den ausgefüllten Antrag per e-Mail an die Adresse katasterauskunft@gelsenkirchen.de.
|
|
||||||
Voraussetzungen
|
|
||||||
Gesetz über die Landesvermessung und das Liegenschaftskataster (Vermessungs- und Katastergesetz - VermKatG NRW)§ 14 (Fn 2), Bereitstellung und Nutzung der Geobasisdaten des Liegenschaftskatasters, Abs. 2
|
|
||||||
Die Eigentümerangaben werden jedem bereit gestellt, der ein berechtigtes Interesse darlegt. Einer Darlegung des berechtigten Interesses bedarf es nicht, wenn Behörden, Öffentlich bestellte Vermessungsingenieurinnen und Öffentlich bestellte Vermessungsingenieure, Markscheiderinnen und Markscheider sowie Notarinnen und Notare im Rahmen der Wahrnehmung ihrer gesetzlichen Aufgaben tätig werden oder wenn Eigentümerinnen, Eigentümer und Erbbauberechtigte die sie betreffenden Eigentümerangaben beantragen.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
keine
|
|
||||||
Gebühren
|
|
||||||
Nach VermWertKostO NRW, Tarifstelle 3.2, Gebühr je Flurstücks- und Eigentümernachweis 30 €
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
Überschrift: Vermessungsunterlagen
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Vermessungsunterlagen sind alle im Liegenschaftskatasterakten archivierten, flurstücksbezogenen Unterlagen, die benötigt werden, um eine Vermessung durchzuführen. Sie können nur von Vermessungsstellen angefordert werden. Privatpersonen können Informationen aus den Liegenschaftskatasterakten erhalten.
|
|
||||||
Die Stadt Gelsenkirchen nutzt seit Dezember 2018 das Vermessungsunterlagenportal des Landes NRW zur Bereitstellung der Vermessungsunterlagen.
|
|
||||||
Folgenden Stand der Vermessungsunterlagen können wir Ihnen momentan anbieten:
|
|
||||||
|
|
||||||
Flächendeckend alle Vermessungsunterlagen (Vermessungsrisse, AP-Karten mit Übersicht, NAS-Daten, Grenzniederschriften) in allen 10 Gemarkungen bis zum Jahr 1960 zurück.
|
|
||||||
Flächendeckend alle Vermessungsunterlagen in den Gemarkungen Horst (5128), Bismarck (5143), Bulmke (5266),Gelsenkirchen, (5267), Heßler (5268), Hüllen (5269) und Ückendorf (5271) bis zur Urmessung/Neumessung zurück.
|
|
||||||
In den Gemarkungen Buer (5126), Schalke (5270) und Rotthausen (5220) sind die Vermessungsunterlagen ab 1959 zurück bis zur Urmessung/Neumessung noch im Aufbau und damit bisher nur teilweise verfügbar.
|
|
||||||
|
|
||||||
Den Service für Punktreservierungen bieten wir dort ebenfalls an.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
keine
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
Überschrift: Entfernungsbescheinigung
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Mit der Entfernungsbescheinigung wird die kürzeste Entfernung zwischen zwei Orten ermittelt, berechnet und bescheinigt. Die Entfernungsbescheinigung wird oftmals als Nachweis für Behörden genutzt, die eine Entscheidung aufgrund einer Entfernung (z.B. Entfernung zwischen Wohnort und Arbeitsstelle - Trennungsgeldentschädigung) treffen müssen.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
keine
|
|
||||||
Gebühren
|
|
||||||
Nach VermWertKostO NRW, § 2 (7), Gebühr für jede angefangene Arbeitsviertelstunde 25 €.
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
Überschrift: Auskunft zum Grundwasserstand
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Wenn Sie in Gelsenkirchen bauen oder ein Haus kaufen möchten, spielt neben der Altlastensituation auch die Frage nach dem Grundwasserstand eine wichtige Rolle.
|
|
||||||
Um beim Bau oder Kauf eines Hauses entsprechende Vorkehrungen gegen evtl. eindringendes Grundwasser zu treffen, ist es sehr sinnvoll, vorab Informationen über die Grundwassersituation abzufragen.
|
|
||||||
Die Untere Bodenschutzbehörde der Stadt Gelsenkirchen führt bereits seit mehr als 10 Jahren ein Grundwasserkataster. Im gesamten Stadtgebiet werden in regelmäßigen Abständen die Grundwasserstände eingemessen. Ergebnis dieser Untersuchung ist ein flächendeckend vorliegender Grundwassergleichen- und Flurabstandsplan.
|
|
||||||
Da aber über das Stadtgebiet verteilt nur eine begrenzte Anzahl an Grundwassermessstellen im Rahmen der Messungen berücksichtigt werden, handelt es sich bei den Grundwasserständen um berechnete Werte (interpoliert). Die Grundwasserstände können also nicht genau auf den Dezimeter bestimmt werden. Die vorliegenden Pläne sind jedoch ein gutes Instrument, um einen Überblick über die Grundwassersituation zu erhalten. Im Einzelfall können darauf aufbauend noch weitere Untersuchungen notwendig werden.
|
|
||||||
Neben den o. g. Informationen liegen uns auch Hinweise auf mögliche Belastungen im Grundwasser vor.
|
|
||||||
Sollten Sie also Informationen über das Grundwasser benötigen, berät Sie die Untere Bodenschutzbehörde gerne.
|
|
||||||
Sprechen Sie uns ebenfalls zu Auskünften aus dem Altlastenkataster oder bei geplanten Erdbauarbeiten an.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
- formloser Antrag per E-Mail, Post oder Telefon mit genauer Adresse des Grundstückes.
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
Überschrift: Beratung und Unterstützung in Unterhaltsangelegenheiten
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Mütter und Väter, die alleine für ein Kind zu sorgen haben, sowie junge Volljährige bis zum 21. Geburtstag, haben Anspruch auf Beratung und Unterstützung bei der Geltendmachung von Unterhaltsansprüchen des Kindes gegenüber dem anderen Elternteil, bzw. ihren Eltern.
|
|
||||||
Ebenfalls haben Mütter und Väter, die nicht miteinander verheiratet sind, einen Anspruch auf Beratung und Unterstützung bei der Geltendmachung ihrer eigenen Unterhaltsansprüche (Betreuungsunterhalt).
|
|
||||||
Voraussetzungen
|
|
||||||
Die Beratung und Unterstützung erhält der Elternteil, dem die alleinige elterliche Sorge zusteht, bei gemeinsamer Sorge, der Elternteil, in dessen Obhut sich das Kind befindet. Die Beratung junger Volljähriger endet mit dem 21. Geburtstag.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
|
|
||||||
evtl. bereits bestehende Unterhaltsvereinbarungen / Unterhaltstitel
|
|
||||||
evtl. Unterlagen über Ausbildung/Schule/Studium und evtl. vorhandenes Einkommen
|
|
||||||
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
Überschrift: Sorgeerklärung (Beurkundung)
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Nicht miteinander verheiratete Eltern können durch eine übereinstimmende Erklärung die gemeinsame elterliche Sorge für ihr Kind übernehmen. Diese Erklärung kann nach Terminvereinbarung bei der Beistandschaft des Jugendamtes Gelsenkirchen oder vor einem Notar beurkundet werden. Die Abgabe der Sorgeerklärung kann auch schon vor Geburt des Kindes erfolgen.
|
|
||||||
Voraussetzungen
|
|
||||||
|
|
||||||
Die Sorgeerklärung setzt das rechtswirksame Bestehen der Vaterschaft voraus.
|
|
||||||
Es wurde bisher keine gerichtliche Sorgeregelung getroffen.
|
|
||||||
|
|
||||||
Benötigte Unterlagen
|
|
||||||
|
|
||||||
Gültige Ausweispapiere
|
|
||||||
Geburtsurkunde des Kindes
|
|
||||||
Mutterpass, bei Beurkundung vor Geburt des Kindes
|
|
||||||
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
Überschrift: Anlagen an Gewässern
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Jeder von uns kennt an Gewässern bauliche Anlagen. Die bekanntesten sind zum Beispiel Brücken, die uns sicher über ein Gewässer bringen. Aber auch nicht gleich bekannte bauliche Anlagen fallen hier runter, unter anderem Stege, Zäune, Kabel, Dämme, Rohrleitungen oder auch Wege.
|
|
||||||
Die baulichen Anlagen können eine Einwirkung auf ein Gewässer darstellen. So können Brücken mit ihren Pfeilern das Gewässerbett verengen, was im schlimmsten Fall zu einem Rückstau des Wassers führen könnte. Aus diesem Grund müssen solche Anlagen an Gewässern von der unteren Wasserbehörde genehmigt werden.
|
|
||||||
Wir beraten Sie gerne vorab, um einschätzen zu können, ob das Vorhaben grundsätzlich genehmigungsfähig ist. Wir empfehlen, Ihren Antrag und den Umfang der erforderlichen Antragsunterlagen (z.B. Statik, Hydraulik, etc.) im Vorfeld mit der Unteren Wasserbehörde abzustimmen. Den Antrag reichen Sie bitte mindestens 4 Wochen vor der geplanten Umsetzung ein.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
Grundsätzlich benötigte Unterlagen:
|
|
||||||
· Erläuterungsbericht
|
|
||||||
· Übersichtslageplan
|
|
||||||
· Planunterlagen (Lagepläne, Schnitte und Details)
|
|
||||||
· Kostenschätzung der Baukosten
|
|
||||||
Einzelfallabhängig:
|
|
||||||
· ggf. geprüfte Statik (Brücken und Stege)
|
|
||||||
· ggf. Hydraulik (Durchlass, Verrohrung)
|
|
||||||
Gebühren
|
|
||||||
Die Verwaltungsgebühr bemisst sich nach der Höhe der Baukosten.
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
Überschrift: Niederschlagswasser und Regenwasser
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Sie möchten Regenwasser nicht mehr in die Kanalisation ableiten?
|
|
||||||
Für die Einleitung von Niederschlagswasser in das Grundwasser über eine Versickerungsanlage (z. B. Sickerschächte, Kiesrigolen) ist eine wasserrechtliche Erlaubnis beim Referat Umwelt (Abteilung Technischer Umweltschutz, Untere Wasserbehörde) zu beantragen. Dies gilt auch, wenn Niederschlagswasser in ein oberirdisches Gewässer eingeleitet werden soll. Erlaubnisfrei ist das Sammeln von Niederschlagswasser in Behältern und die breitflächige Versickerung über die belebte Bodenzone (z.B. in einer flachen Mulde) bis zu einer Entwässerungsfläche von 50 m².
|
|
||||||
Voraussetzungen
|
|
||||||
Der Antragsteller ist Eigentümer des betreffenden Grundstücks oder besitzt eine Vollmacht des Grundstückseigentümers.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
Einzelfallabhängig:
|
|
||||||
|
|
||||||
Antragsformular
|
|
||||||
Lageplan im Maßstab 1:1 000 oder 1:500
|
|
||||||
Beschreibung der Versickerungsanlage und der Gebäudeflächen, von denen Niederschlagswasser zur Versickerung gebracht wird (mit Maßangaben, Angaben zu Gemarkung, Flur, Flurstücksnummer, Rechts- und Hochwerte bzw. ETRS89/UTM-Koordinaten)
|
|
||||||
Schnitte durch die Versickerungsanlage/Einleitstelle mit Maßangaben
|
|
||||||
Nachweis der Versickerungsfähigkeit des Untergrundes. Sollte ein Bodengutachten vorliegen, bitten wir um ein Exemplar oder entsprechende Auszüge.
|
|
||||||
Angabe der durchschnittlichen Jahresmenge des einzuleitenden Niederschlagswassers
|
|
||||||
Bemessung der Anlage
|
|
||||||
Entsprechender Ausschnitt der topografischen Karte im Maßstab 1 : 25000
|
|
||||||
Angaben zur Regenwasserbehandlung, wenn Flächen an die Versickerungsanlage oder Einleitung angeschlossen werden, die z.B. von Kraftfahrzeugen befahren werden können.
|
|
||||||
|
|
||||||
Weitere Informationen und Antragsvordrucke finden Sie hier:
|
|
||||||
Regenwasserversickerung
|
|
||||||
Einleitung in ein Gewässer
|
|
||||||
Gebühren
|
|
||||||
Die Mindestgebühr für die wasserrechtliche Erlaubnis beträgt 200,00 €.
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
Überschrift: Brunnen
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Grundwasser ist als Bestandteil des Naturhaushaltes ein besonders schützenswertes Gut. Es ist so zu bewirtschaften, dass es dem Wohl der Allgemeinheit dient und vermeidbare Beeinträchtigungen vermieden werden. Die Benutzung von Grundwasser, z. B. durch Brunnen, ist deswegen grundsätzlich erlaubnispflichtig. Die Absicht, einen Brunnen anzulegen, ist in jedem Falle beim Referat Umwelt (Abteilung technischer Umweltschutz, Untere Wasserbehörde) anzuzeigen.
|
|
||||||
Erlaubnisfreie Brunnen
|
|
||||||
Als erlaubnisfreie Benutzungen gelten lediglich Benutzungen für einen einzelnen Haushalt, für den landwirtschaftlichen Hofbetrieb, für das Tränken von Vieh außerhalb des Hofbetriebes, zum Zweck der gewöhnlichen Bodenentwässerung landwirtschaftlich, forstwirtschaftlich und gärtnerisch genutzter Grundstücke. Soll das gehobene Grundwasser jedoch für mehr als einen Haushalt oder für einen Gewerbebetrieb genutzt werden, so ist eine wasserrechtliche Erlaubnis erforderlich. Im Zweifelsfall beraten wir Sie gerne, ob eine Erlaubnispflicht notwendig ist.
|
|
||||||
Voraussetzungen
|
|
||||||
Der Antragsteller ist Eigentümer des betreffenden Grundstücks oder besitzt eine Vollmacht des Grundstückseigentümers.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
Einzelfallabhängig:
|
|
||||||
Anzeige eines erlaubnisfreien Brunnens:
|
|
||||||
|
|
||||||
formlose Anzeige
|
|
||||||
Ort und Datum: Straße, Hausnummer, ggf. Gemarkung, Flur, Flurstücksnummer
|
|
||||||
kurze Beschreibung des Vorhabens (Verwendungszweck, Wassermengen, beabsichtigte Tiefe)
|
|
||||||
Name und Anschrift der ausführenden Firma
|
|
||||||
Anzahl der Bohrungen
|
|
||||||
beabsichtigte Tiefe der Bohrungen
|
|
||||||
Durchmesser der Bohrungen
|
|
||||||
zur Verwendung kommende Spülzusätze mit Sicherheitsdatenblatt
|
|
||||||
Verbleib des Bohrwassers und des Bohrgutes
|
|
||||||
Angaben zur Sicherung der Bohrung (Schutzrohr?)
|
|
||||||
zur Verwendung kommendes Verpressmaterial
|
|
||||||
Lageskizze mit möglichst genauer Einzeichnung der geplanten Bohrung
|
|
||||||
ggf. Vollmacht bzw. Einverständniserklärung des Grundstückseigentümers
|
|
||||||
|
|
||||||
Gebühren
|
|
||||||
Die Mindestgebühr für die Prüfung einer Anzeige nach § 49 Wasserhaushaltsgesetz beträgt 50,00 Euro.
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
Überschrift: Versickerung von Niederschlagswasser
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Der einfachste Umgang mit Niederschlagswasser ist die Versickerung im Boden und ist insbesondere bei Wohnhäusern kein Problem. Das Niederschlagswasser kann aber mit unterschiedlichsten Stoffen in Berührung kommen, zum Beispiel von Verkehrsbereichen. Hier kann es mit Öl, Benzin oder auch Reifenabrieb verunreinigt werden. Da viele Stoffe eine schädliche Wirkung auf das Grundwasser haben können, ist es manchmal notwendig, dass anfallende Niederschlagswasser vor der Versickerung vorzubehandeln. Bei großen Vorhaben kann es sein, dass hierfür eine spezielle technische Vorbehandlung nötig wird, die einer Anlagengenehmigung bedarf.
|
|
||||||
Gerne beraten wir sie im Vorfeld, ob eine Vorbehandlung des Niederschlagswassers nötig ist.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
Grundsätzlich benötigte Unterlagen:
|
|
||||||
|
|
||||||
Erläuterungsbericht
|
|
||||||
Lageplan im Maßstab 1:1 000 oder 1:500 mit Darstellung der angeschlossenen Flächen und Kategorisierung gem. Trennerlass
|
|
||||||
Beschreibung der geplanten Behandlungsanlage inklusive der hydraulischen und stofflichen Bemessung.
|
|
||||||
Bodenansprache mit Schichtenverzeichnis
|
|
||||||
|
|
||||||
Einzelfallabhängig
|
|
||||||
|
|
||||||
Vorlage des Nachweises der Vergleichbarkeit (z.B. DWA-M153)
|
|
||||||
|
|
||||||
Die Unterlagen sind mindestens in zweifacher Ausfertigung und im Bedarfsfall in mehrfacher Ausfertigung einzureichen. Es wird dringend empfohlen vor Antragsstellung Kontakt mit den genannten Ansprechpartnern und Ansprechpartnerinnen zu suchen, um das Vorhaben frühzeitig auf die grundsätzliche Genehmigungsfähigkeit hin prüfen zu lassen.
|
|
||||||
Gebühren
|
|
||||||
|
|
||||||
Die Mindestgebühr für die Genehmigung beträgt 200,00 €.
|
|
||||||
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
Überschrift: Grundwasserhaltungen / Trockenhaltung von Baugruben oder Gebäuden
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Grundwasser ist als Bestandteil des Naturhaushaltes ein besonders schützenswertes Gut. Grundwasserabsenkungen/-ableitungen sind daher grundsätzlich erlaubnispflichtig. Eine entsprechende Erlaubnis ist bei der Stadt Gelsenkirchen (Referat Umwelt - untere Wasserbehörde) zu beantragen.
|
|
||||||
Dies gilt auch für eine dauerhafte Grundwasserableitung nach Beendigung einer Baumaßnahme (z.B. Gebäudedränage).
|
|
||||||
Benötigte Unterlagen
|
|
||||||
Einzellfallabhängig:
|
|
||||||
|
|
||||||
Antragsformular
|
|
||||||
Lageplan im Maßstab 1:1 000 oder 1:500
|
|
||||||
Erläuterungsbericht mit Antragsschreiben / Antragsvordruck
|
|
||||||
Lageplan mit Eintrag der Einleitstelle
|
|
||||||
ggf. Bodengutachten mit Bodenprofilen
|
|
||||||
hydraulischer Nachweis (Wassermengen, Dauer, Verbleib)
|
|
||||||
Plan mit Eintragung des Absenkungsbereiches
|
|
||||||
im Einzelfall nach Abstimmung: Stellungnahme zum Einfluss der Grundwasserableitung auf die vorhandene Bebauung. Aus der Stellungnahme muss hervorgehen, dass ein negativer Einfluss auf die Bebauung auszuschließen ist bzw. wie ein solcher unterbunden werden kann.
|
|
||||||
Angaben zu Altlasten, ggf. Grundwasserqualität in Abstimmung ermitteln
|
|
||||||
|
|
||||||
Die Unterlagen sind mindestens in zweifacher Ausfertigung und im Bedarfsfall in mehrfacher Ausfertigung einzureichen.
|
|
||||||
Gebühren
|
|
||||||
Die Mindestgebühr für die wasserrechtliche Erlaubnis beträgt 200,00 €.
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
Überschrift: Gestattung zum Ausschank alkoholhaltiger Getränke
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Wenn Sie aus einem besonderen Anlass vorübergehend alkoholhaltige Getränke zum Verzehr an Ort und Stelle gegen Bezahlung anbieten wollen, benötigen Sie dafür eine Gestattung. Beispiele für solche Anlässe sind Schützenfeste, Pfarrfeste, Einweihungen oder Jubiläen.
|
|
||||||
Die Gestattung erhalten Sie durch einen schriftlichen Antrag. Der Antrag muss mindestens folgende Angaben enthalten: Name und Vorname des Antragstellers, Art, Ort und Datum der Veranstaltung, Größe des Standes, Saales oder Festzeltes, Art der Getränke.
|
|
||||||
Hinweise:In besonderen Einzelfällen sind zusätzlich Unterlagen zur persönlichen Zuverlässigkeit und/oder zu dem Miet-/Pachtobjekt vorzulegen. Die Information darüber erhalten Sie durch uns. Eine persönliche Vorsprache ist nicht zwingend erforderlich, bietet sich jedoch bei umfangreichen Vorhaben an.
|
|
||||||
Findet die Veranstaltung im öffentlichen Straßenraum statt, ist zusätzlich eine Sondernutzungserlaubnis zu beantragen.
|
|
||||||
Bitte beachten Sie bei einer Antragstellung auch unsere Datenschutzhinweise.
|
|
||||||
Voraussetzungen
|
|
||||||
§ 12 Gaststättengesetz
|
|
||||||
Benötigte Unterlagen
|
|
||||||
keine
|
|
||||||
Gebühren
|
|
||||||
Die Höhe der Verwaltungsgebühr richtet sich nach dem jeweiligen Einzelfall (25 bis 200 Euro).
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
Überschrift: Erdaufschlüsse
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Erdaufschlüsse sind z. B. Bohrungen, Sondierungen oder das Ausheben von Baugruben.
|
|
||||||
Arbeiten, die so tief in den Boden eindringen, dass sie sich auf das Grundwasser auswirken können, sind dem Referat Umwelt (Abteilung Technischer Umweltschutz, Untere Wasserbehörde) einen Monat vor Beginn der Arbeiten anzuzeigen. Dies gilt ebenfalls für die Bohrung eines erlaubnisfreien Brunnens.
|
|
||||||
Ausnahme: Die gesonderte Anzeige der Bohrung ist nicht erforderlich, wenn die Bohrung nach Erteilung einer wasserrechtlichen Erlaubnis zur Grundwasserentnahme oder Nutzung von Erdwärme erfolgt.
|
|
||||||
Voraussetzungen
|
|
||||||
Der Antragsteller ist Eigentümer des betreffenden Grundstücks oder besitzt eine Vollmacht des Grundstückseigentümers.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
Einzelfallabhängig:
|
|
||||||
|
|
||||||
Erläuterungsbericht (Beschreibung des Vorhabens)
|
|
||||||
Ort (Straße, Hausnummer, ggf. Gemarkung, Flur, Flurstücksnummer, Koordinaten ETRS)
|
|
||||||
Datum der Durchführung
|
|
||||||
Name und Anschrift der ausführenden Firma
|
|
||||||
Angaben zur Bohrung (Anzahl, beabsichtigte Tiefe, Durchmesser)
|
|
||||||
zur Verwendung kommende Spülzusätze mit Sicherheitsdatenblatt
|
|
||||||
Verbleib des Bohrwassers und des Bohrgutes
|
|
||||||
Angaben zur Sicherung der Bohrung (Schutzrohr?)
|
|
||||||
zur Verwendung kommendes Verpressmaterial
|
|
||||||
Lageskizze mit möglichst genauer Einzeichnung der geplanten Bohrung
|
|
||||||
ggf. Vollmacht / Einverständniserklärung des Grundstückseigentümers
|
|
||||||
|
|
||||||
Die Unterlagen sind mindestens in zweifacher Ausfertigung und im Bedarfsfall in mehrfacher Ausfertigung einzureichen.
|
|
||||||
Gebühren
|
|
||||||
Die Mindestgebühr für die Bearbeitung der Anzeige beträgt 50,00 €.
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
Überschrift: Betriebliches Abwasser / Indirekteinleiter
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Indirekteinleiter sind Abwassereinleiter, deren Abwasser nicht unmittelbar in ein Gewässer, sondern in eine öffentliche Abwasseranlage (z. B. städtische Kanalisation) eingeleitet wird. Produktionsabwässer von Industrie- und Gewerbebetrieben vieler Branchen können dabei gefährliche Abwasserinhaltsstoffe enthalten wie zum Beispiel Schwermetalle.
|
|
||||||
Wenn Abwasser mit gefährlichen Stoffen in die Kanalisation gelangt, kann das zu Verunreinigungen und Schädigungen der Oberflächengewässer führen, da diese Schadstoffe in der Kläranlage nicht ausreichend abgebaut werden können. Überdies können sie den Betrieb und biologischen Reinigungsprozess der Kläranlage stören.
|
|
||||||
Diese gefährlichen Stoffe sollen daher schon an ihrer Anfallstelle, bei der Industrie als Indirekteinleiter zurückgehalten oder aus dem Abwasser ferngehalten werden. Um dieses Ziel zu erreichen, können den Betrieben, entsprechend den branchenspezifischen wasserrechtlichen Mindestanforderungen, Maßnahmen zur Vermeidung des Eintrags gefährlicher Stoffe in das Abwasser sowie die Errichtung und Betrieb von Abwasserbehandlungsanlagen zur Einhaltung der festzusetzenden Überwachungswerte aufgegeben werden.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
|
|
||||||
Erläuterungsbericht
|
|
||||||
Lageplan
|
|
||||||
Betriebsbeschreibung
|
|
||||||
EntwässerungsplanDarüber hinaus können weitere Unterlagen erforderlich sein. Informieren Sie sich bitte frühzeitig bei den angegebenen Ansprechpartnerinnen und Ansprechpartnern.
|
|
||||||
|
|
||||||
Gebühren
|
|
||||||
Im Regelfall wird eine Mindestgebühr in Höhe von 250 Euro fällig.
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
Überschrift: Beratung rund um das Thema Älterwerden
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
In den Infocentern arbeiten mit großem persönlichen Einsatz qualifizierte Mitarbeiterinnen und Mitarbeiter, die es sich zur Aufgabe gemacht haben, Sie bestmöglich zu unterstützen. Sie bieten Ihnen Zeit für ein persönliches Gespräch und für Information, Beratung und Hilfe aus einer Hand zu allen Themen rund um das Älterwerden (z.B. Pflege, Demenz und seniorengerechtes Wohnen).
|
|
||||||
Benötigte Unterlagen
|
|
||||||
keine
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
Überschrift: Historische Kennzeichen (H-Kennzeichen)
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Das Fahrzeug muss vor mindestens 30 Jahren erstmals in den Verkehr gekommen sein (= Erstzulassung) und weitestgehend dem Originalzustand entsprechen, sowie in einem guten Erhaltungszustand sein.Diese Voraussetzungen stellen die technischen Prüfstellen in einem speziellen Oldtimergutachten gemäß § 23 der Straßenverkehrs-Zulassungs-Ordnung (StVZO) fest.
|
|
||||||
Erfüllt Ihr Fahrzeug diese Voraussetzungen, wird das zugehörige Kennzeichen hinter der Erkennungsnummer mit einem "H" gekennzeichnet.
|
|
||||||
Das Historienkennzeichen kann auch im Zuge einer Zulassung oder Umschreibung beantragt werden.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
|
|
||||||
Personalausweis oder Reisepass (bitte beachten Sie, dass eine Unterschrift vorhanden sein muss)
|
|
||||||
Vollmacht und Ausweis des Bevollmächtigten falls Sie nicht persönlich zur Änderung vorsprechen
|
|
||||||
Zulassungsbescheinigung Teil I / Fahrzeugschein
|
|
||||||
Zulassungsbescheinigung Teil II / Fahrzeugbrief
|
|
||||||
Gutachten nach §23 StVZO für Oldtimer
|
|
||||||
die alten Kennzeichenschilder
|
|
||||||
|
|
||||||
ist das Fahrzeug noch nicht zugelassen halten Sie bitte auch Folgendes bereit:
|
|
||||||
|
|
||||||
Versicherungsbestätigung (eVb-Nummer)
|
|
||||||
SEPA-Lastschriftmandat für die KFZ-Steuer
|
|
||||||
|
|
||||||
Falls das Fahrzeug auf ein Unternehmen oder einen Verein mit Sitz oder Niederlassung in Gelsenkirchen zugelasssen werden soll, benötigen Sie zusätzliches folgendes:
|
|
||||||
|
|
||||||
Ausweis(e) der Geschäftsführung
|
|
||||||
Gewerbe-Anmeldung
|
|
||||||
Auszug aus dem Handelsregister (bei einer GmbH § Co. KG wird auch das Handelsregister der GmbH benötigt)
|
|
||||||
Auszug aus dem Vereinsregister
|
|
||||||
|
|
||||||
Gebühren
|
|
||||||
Die Einführung der neuen FZV am 01.09.2023 bringt auch Veränderungen bei den Gebühren mit sich. Die einzelnen Amtshandlungen in den Zulassungsstellen werden bundesweit teilweise höher belegt. Diese Gebührenerhöhung ist gesetzlich vorgeschrieben und nicht im Ermessen der Behörde.
|
|
||||||
Durch die Änderung des Gesetzes im März 2007 können die Gebühren für Ihre Zulassung in Einzelfällen abweichend von den hier aufgeführten Preisen sein. - 30,00 Euro: Grundgebühr zzgl. weiterer Gebühren im Rahmen der Zulassung bspw. durch technische Änderungen, Feinstaubplakette, Wunschkennzeichen etc.
|
|
||||||
Die Anfertigung der Kennzeichenschilder ist keine Dienstleistung der Kfz-Zulassungsbehörde. Über gesondert anfallende Kosten kann keine Auskunft gegeben werden.
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
Überschrift: Rote Dauerkennzeichen zur wiederkehrenden Verwendung für Händler gem. §41 FZV
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Sie betreiben ein Gewerbe in der KFZ-Branche in Gelsenkirchen und möchten rote Dauerkennzeichen für Überführungs-, Prüfungs- oder Probefahrten mit Ihren KFZ beantragen.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
|
|
||||||
Personlausweis oder Reisepass und Führerschein
|
|
||||||
SEPA-Lastschriftmandat für die Kfz-Steuer
|
|
||||||
formloser, schriftlicher Antrag mit eingehender Begründung
|
|
||||||
Bundeszentralregisterauszug (Führungszeugnis) Belegart 'O' Verwendungszweck: Rote Dauerkennzeichen (erhältlich im BÜRGERcenter oder online unter www.fuehrungszeugnis.bund.de)
|
|
||||||
Verkehrszentralregisterauszug (online unter www.kba.de)
|
|
||||||
Nachweis eines auf sie zugelassenen Alltagsfahrzeuges
|
|
||||||
Gewerbemeldebescheinigung (erhältlich bei der Gewerbemeldestelle Bochumerstr. 12 - 16)
|
|
||||||
Versicherungsbestätigung für Rote Kennzeichen zur wiederkehrenden Verwendung
|
|
||||||
Unbedenklichkeitsbescheinigung des Finanzamt des Betriebssitzes und falls abweichend zusätzlich des Wohnortes
|
|
||||||
Unbedenklichkeitsbescheinigung des Steueramtes (Gewerbesteuerprüfung) des Betriebssitzes und falls abweichend zusätzlich des Wohnorts
|
|
||||||
Auszug aus der Schuldnerkartei des Amtsgerichts online unter www.vollstreckungsportal.de
|
|
||||||
Nachweis über das Vorhandensein ausreichender Betriebsfläche durch Pacht-/Mietvertrag o.Grundbuchauszug. Wenn die Betriebsfläche in einem Wohngebiet liegt, ist zusätzlich eine baunutzungsrechtliche Genehmigung beizubringen.
|
|
||||||
|
|
||||||
Gebühren
|
|
||||||
bei Erstzuteilung 168,50€bei Verlängerung 136,50€
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
Überschrift: Tempo 100 für Caravan-Kombinationen
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Unter bestimmten Bedingungen dürfen PKW/Wohnanhänger-Kombinationen auf Autobahnen und autobahnähnlichen Kraftfahrtstraßen bis zu 100 km/h fahren. Anhänger, die die Voraussetzungen erfüllen, erhalten ein entsprechendes Gutachten beim TÜV, das anschließend von der Zulassungsstelle bestätigt wird. Hier erhalten Sie auch den 100 km/h-Aufkleber, der Ihren Anhänger im Straßenverkehr als 100 km/h-tauglich ausweist. So ausgerüstet steht einer entspannteren Fahrt in den Urlaub nichts mehr entgegen.
|
|
||||||
Voraussetzungen
|
|
||||||
|
|
||||||
Die zulässige Gesamtmasse des Zugfahrzeugs darf nicht grösser als 3,5t sein
|
|
||||||
Das Zugfahrzeug muss mit ABS ausgestattet sein
|
|
||||||
Die Reifen des Caravans müssen jünger als 6 Jahre sein und mindestens der Geschwindigkeitskategorie L(=120km/h) entsprechen
|
|
||||||
Der Caravan muss hydraulische Achsstossdämpfer haben
|
|
||||||
Die Stützlast der Kombination ist an der größtmöglichen Stützlast des Zugfahrzeugs oder des Anhängers zu orientieren, wobei als Obergrenze der jeweils kleinere Wert gilt
|
|
||||||
Die zulässige Gesamtmasse des Caravans darf die Leermasse des Zugfahrzeugs nicht übersteigen (Faktor 1,0)
|
|
||||||
|
|
||||||
|
|
||||||
Zusätzlich muss der Anhänger mit einer Stabilisierungseinrichtung gemäß ISO 11555-1 der Fassung vom 01.Juli 2003 ausgestattet sein oder mit anderen technischen Einrichtungen, zu denen ein Gutachten (ABE oder Betriebserlaubnis) vorliegt, das einen sicheren Betrieb der Kombination bis 120km/h bestätigt oder das Zugfahrzeug mit einem speziellen elektronischen, fahrdynamischen Stabilitätssystem für Anhängerbetrieb ausgestattet ist, über das eine Bestätigung des Herstellers vorliegt und das in den Fahrzeugpapieren eingetragen ist. In diesem Fall benötigt der Anhänger keine StabilisierungDie meisten bereits zugelassenen Fahrzeuge können nachgerüstet werden. Bei Erfüllung der Voraussetzungen wird von einem anerkannten Sachverständigen (TÜV/DEKRA/GTÜ) eine Bestätigung ausgestellt, mit welchem dann die Zulassungsbehörde eine offizielle Bescheinigung und Tempo-100-Plakette aushändigt. Diese muss hinten am Anhänger angebracht werden. Die Bescheinigung gilt nur für diesen Anhänger und ist permanent mit den KFZ-Papieren mitzuführen.
|
|
||||||
|
|
||||||
Benötigte Unterlagen
|
|
||||||
|
|
||||||
Zulassungsbescheinigung Teil I oder Fahrzeugschein
|
|
||||||
Zulassungsbescheinigung Teil II oder Fahrzeugbrief
|
|
||||||
Gutachten eines anerkannten Sachverständigen (TÜV/DEKRA/GTÜ)
|
|
||||||
|
|
||||||
Gebühren
|
|
||||||
|
|
||||||
bei Vorlage der neuen EU-Papiere 15,30€
|
|
||||||
bei Vorlage der alten Papiere* 18,70€
|
|
||||||
|
|
||||||
Den 100 km/h-Aufkleber für Ihren Anhänger erhalten Sie beim Schildermacher.
|
|
||||||
Die Gebühren für das Gutachten des anerkannten Sachverständigen erfragen Sei bitte dort (TÜV, DEKRA, GTÜ, etc.)
|
|
||||||
*sollten Sie noch im Besitz der alten Fahrzeugpapiere (Fahrzeugbrief und -schein) sein, werden diese bei der Eintragung automatisch in die neuen EU-harmonisierten Papiere umgetauscht.
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
Überschrift: Anmeldung eines Neufahrzeugs/Gebrauchtfahrzeugs aus dem Ausland
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Es soll ein Gebrauchtfahrzeug zugelassen werden, das in einem Staat der Europäischen Union (EU) oder einem Vertragsstaat des Abkommens über den Europäischen Wirtschaftsraumes (EWR) erworben wurde.
|
|
||||||
Fahrzeuge, die schon einmal zugelassen waren, gelten als Gebrauchtfahrzeuge.
|
|
||||||
Die Zulassung ist davon abhängig, dass im Falle der Steuerpflicht die Teilnahme am SEPA-Lastschrifteinzugsverfahren erklärt wurde, d.h. die Angabe einer Bankverbindung ist obligatorisch!
|
|
||||||
Es besteht die Möglichkeit, für das Fahrzeug ein Kennzeichen Ihrer Wahl reservieren zu lassen - vorausgesetzt, das Kennzeichen ist frei und verfügbar.Ein Wunschkennzeichen können sie hier online reservieren.
|
|
||||||
Es ist zu beachten, dass zusätzlich zu Verwaltungsgebühren auch Kosten für die Kennzeichenschilder entstehen. Es werden grundsätzlich alle Unterlagen im Original benötigt.
|
|
||||||
Voraussetzungen
|
|
||||||
|
|
||||||
Das Fahrzeug war in der EU / im EWR bereits zugelassen.
|
|
||||||
Unterlagen im OriginalBitte bringen Sie alle Unterlagen grundsätzlich im Original mit.
|
|
||||||
|
|
||||||
Benötigte Unterlagen
|
|
||||||
|
|
||||||
ausgefüllter Zulassungsantrag
|
|
||||||
SEPA-Lastschriftmandat (Unterschrift des zukünftigen Halters notwendig!)
|
|
||||||
Kaufvertrag/Rechnung
|
|
||||||
elektronische Versicherungsbestätigung (eVB-Nummer)
|
|
||||||
Personalausweis oder Reise-/Nationalpass in Original (oder amtlich beglaubigte Kopie)
|
|
||||||
ausländische Zulassungsbescheinigung / en
|
|
||||||
Vorlage der/des ausländischen Kennzeichen/s bei zugelassenen Fahrzeugen (sofern vorhanden)
|
|
||||||
COC-Papier (EG-Übereinstimmungsbescheinigung) / Datenbestätigung des HerstellersBei typgenehmigten Fahrzeugen weisen Sie die technischen Daten bitte mit einem COC-Papier (EG-Übereinstimmungsbescheinigung) / einer Datenbestätigung des Herstellers nach.
|
|
||||||
Nachweis einer gültigen Hauptuntersuchung nach § 29 StVZO. Hierauf kann verzichtet werden, wenn Sie aufgrund des geringen Alters des Fahrzeuges ggf. eine Hauptuntersuchung vom Werk haben. Bei einem PKW beispielsweise 3 Jahre ab Tag der Erstzulassung
|
|
||||||
Gutachten nach § 21 StVZOBei Fahrzeugen ohne Typgenehmigung ist ein Gutachten nach § 21 StVZO notwendig (nicht älter als 18 Monate). Dieses Gutachten beinhaltet eine Hauptuntersuchung.
|
|
||||||
Zollunbedenklichkeitsbescheinigung (bei Einfuhr des Fahrzeugs aus einem Nichtmitgliedstaat der EU)
|
|
||||||
|
|
||||||
Falls das Fahrzeug auf ein Unternehmen oder einen Verein mit Sitz oder Niederlassung in Gelsenkirchen zugelassen werden soll, benötigen Sie zusätzliches folgendes:
|
|
||||||
|
|
||||||
Ausweis(e) der Geschäftsführung
|
|
||||||
Gewerbe-Anmeldung
|
|
||||||
Auszug aus dem Handelsregister (bei einer GmbH § Co. KG wird auch das Handelsregister der GmbH benötigt)
|
|
||||||
Auszug aus dem Vereinsregister
|
|
||||||
|
|
||||||
Hinweis:
|
|
||||||
Durch die Anmeldung des Fahrzeugs in Gelsenkirchen, erfolgt eine Benachrichtigung an das Herkunftsland.Sollte das Fahrzeug im Herkunftsland noch nicht abgemeldet sein, ist der Halter hierfür zuständig.
|
|
||||||
Bitte beachten Sie, dass sich im Einzelfall aus dem Sachverhalt und der Geschichte des Fahrzeugs noch weitere Unterlagen ergeben können, die für die Zulassung notwendig sind und die Sie ggf. noch besorgen müssen.
|
|
||||||
Zur Ausstellung einer Zulassungsbescheinigung Teil II ist eine Identifizierung gem. §14 Abs. 8 FZV nötig.
|
|
||||||
Eine FIN-Bestätigung oder aktueller Nachweis über eine gültige Hauptuntersuchung kann eine Vorführung Ihres Fahrzeugs bei der Zulassungsbehörde ersparen.
|
|
||||||
Bei Vorführungen von Sonderfahrzeugen wie z.B. bei Überlänge oder über einem Gesamtgewicht von 12000kg können Sie sich direkt mit dem jeweiligen Anliegen an die Teamleitung unter fahrzeugzulassungen@gelsenkirchen.de wenden.
|
|
||||||
Gebühren
|
|
||||||
Die Einführung der neuen FZV am 01.09.2023 bringt auch Veränderungen bei den Gebühren mit sich. Die einzelnen Amtshandlungen in den Zulassungsstellen werden bundesweit teilweise höher belegt. Diese Gebührenerhöhung ist gesetzlich vorgeschrieben und nicht im Ermessen der Behörde.
|
|
||||||
Durch die Änderung des Gesetzes im März 2007 können die Gebühren für Ihre Zulassung in Einzelfällen abweichend von den hier aufgeführten Preisen sein. - 30,00 Euro: Grundgebühr zzgl. weiterer Gebühren im Rahmen der Zulassung bspw. durch technische Änderungen, Feinstaubplakette, Wunschkennzeichen etc.
|
|
||||||
Die Höhe der Kosten für die Begutachtung beim TÜV erfragen Sie bitte dort.
|
|
||||||
Die Anfertigung der Kennzeichenschilder ist keine Dienstleistung der Kfz-Zulassungsbehörde. Über gesondert anfallende Kosten kann keine Auskunft gegeben werden.
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
Überschrift: Geothermie / Erdwärmenutzung
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Für die Nutzung von Wärme oder Kälte aus dem Erdreich / Grundwasser zur Temperierung eines Gebäudes ist eine wasserrechtliche Erlaubnis beim Referat Umwelt (Abteilung Technischer Umweltschutz) zu beantragen. Die Bearbeitungsdauer für einen vollständig eingereichten Antrag beträgt in der Regel vier Kalenderwochen.
|
|
||||||
Bei Bohrungen über 100 m Tiefe ist zusätzlich eine Anzeige bei der Bezirksregierung Arnsberg (Abteilung Bergbau und Energie) in Dortmund erforderlich.
|
|
||||||
Voraussetzungen
|
|
||||||
Der Antragsteller ist Eigentümer des betreffenden Grundstücks oder besitzt eine Vollmacht des Grundstückseigentümers.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
Einzelfallabhängig:
|
|
||||||
|
|
||||||
vollständig ausgefüllter Antragsvordruck und ggf. ein kurzer Erläuterungsbericht
|
|
||||||
ggf. Vollmacht
|
|
||||||
Übersichtslageplan
|
|
||||||
Lageplan mit Eintragung der Sonden (Kollektoren, Brunnen) mit Vermaßung
|
|
||||||
Wärmebedarfsberechnung
|
|
||||||
Diagramm Geothermische Potentiale / Berechnung der Sondenlänge
|
|
||||||
Technische Daten Wärmepumpe
|
|
||||||
Technische Daten Erdwärmesonden / Kollektoren / Brunnen
|
|
||||||
Technische Daten Verpressmaterial
|
|
||||||
Sicherheitsdatenblatt Wärmeträgerflüssigkeit
|
|
||||||
Sicherheitsdatenblatt Kältemittel
|
|
||||||
Zertifikat Fachunternehmen W 120 der Bohrfirma (bei Erdwärmesonden)
|
|
||||||
Qualifikationsnachweis Bohrgeräteführer (bei Erdwärmesonden)
|
|
||||||
|
|
||||||
Die Unterlagen sind mindestens in zweifacher Ausfertigung und im Bedarfsfall in mehrfacher Ausfertigung einzureichen.
|
|
||||||
Gebühren
|
|
||||||
Die Mindestgebühr für eine Erlaubnis beträgt 250,00 €. Bei einer Leistung der Wärmepumpenanlage von mehr als 50 kW erhöht sich die Gebühr nach einer vorgegebenen Staffelung.
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
Überschrift: Bildungsmediathek NRW - Unterrichtsmedien zum Download
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Die Bildungsmediathek NRW bietet Unterrichtsfilme, Online-Materialien, Internetseiten, Musik, Podcasts und Programme rechtssicher, werbefrei und kostenlos für den Einsatz im Unterricht zum Herunterladen und Streamen an.
|
|
||||||
Wie funktionierts?Wenn Sie Lehrerin oder Lehrer an einer Gelsenkirchener Schule sind, können Sie sich kostenlos für die Bildungsmediathek NRW registrieren lassen. Einfach das Registrierungsformular auf der Bildungsmediathek-Seite ausfüllen und absenden. Ihre Freischaltung wird Ihnen per E-Mail bestätigt.
|
|
||||||
Wenn Sie in IServ angemeldet sind, können Sie ebenfalls die Bildungsmediathek nutzen.
|
|
||||||
Voraussetzungen
|
|
||||||
Lehrkraft an einer Gelsenkirchener Schule.
|
|
||||||
Benötigte Unterlagen
|
|
||||||
keine
|
|
||||||
Gebühren
|
|
||||||
keine
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user