Latest commit

History

23 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

sempr-python

This project provides a small python wrapper for sempr. Be aware that is not feature-complete, and its usage is in many aspects different from the C++ version. What did you expect? This is python! 😉

Installation

This project uses pybind11 to create the python extension module:

pip install pybind11

Although a CMakeLists.txt is present (and you are free to use it, if you want -- personally, I'm using it during development with my PYTHONPATH pointed to the build directory), the compilation and installation is handled by the setup.py:

python setup.py build
python setup.py install

If it fails to find pybind11 in the process, you'll need to specify its location. In my case, like this:

pybind11_DIR=~/pythonenv/lib/python3.6/site-packages/pybind11/share/cmake/pybind11 python setup.py build
python setup.py install

Now you are good to go!

But wait, there is more: Out of the box, many python IDEs do not support code completion and the like for binary modules. I'm using vscode with pylance and struggled a bit to get it all working, so here is what worked for me in the end:

After having installed semprpy, you will need to create stubs for semprpy anywhere on your system (does not need to happen inside the semprpy repository). There are several different methods out there to do this, and what worked in the end for me was using either mypy or pybind11-stubgen.

Note: I struggled a lot to get it all working, but as usual, it is quite simple if you know how. I first got it working with mypy, but noticed that it did not export any documentation, only the signatures. Hence, I gave pybind11-stubgen another try, and that works just fine now! (The only remaining problem being that I did not include much documentation in the python bindings, yet... but that is something else.)

With pybind11-stubgen

The preferred way right now is to use pybind11-stubgen, as it was specifically made to generate stubs from C-extension-modules created with pybind11. It properly includes documentation and signatures in the stubs.

Note: pybind11-stubgen is being moved into mypy, but at the time of writing this, it still outperforms mypy.

pip install pybind11-stubgen
pybind11-stubgen semprpy

This creates a folder ./stubs which you can add to your IDE as a location for stub files. In vscode with pylance, this looks like this for me: stubpath

With mypy

As already mentioned, pybind11-stubgen should give better results. But if you have any trouble with that, you can also use mypy:

pip install mypy

This includes a script called stubgen which we can use to create stubs for any module, package or source file. In this case, we use it to create stubs for the whole semprpy-package:

stubgen -p semprpy

This creates a folder out/semprpy with your stub files. You can use these in vscode with pylance by adding the path to the out folder to the Python > Analysis: Extra Paths. For me, this looks like this: extrapaths

Usage

The created python extension is called semprpy.

importsemprpyassemprcore=sempr.Core('my_database_folder') # or without parameter to skip persistencecore.loadPlugins()
core.addRules('[true() -> (<ex:foo> <ex:bar> <ex:baz>)]')
core.addRules('[EC<Component>(?e ?c) -> (?e <ex:bar> <ex:blub>)]')
forrincore.rules():
print(f'{r.id:2d} : {r.nameifr.nameelse"<unnamed rule>"}')
entity=sempr.Entity()
core.addEntity(entity)
component=sempr.Component() # base class without data, only for testingentity.addComponent(component)
# as always, inference before queryingcore.performInference()
# sparql queries are available, too - and simplified.# No need to get the RDFPlugin first.# But: This will throw if the plugin is not loaded!results=core.query('SELECT * WHERE { ?a <ex:bar> ?b . }')
forrinresults:
# r is a dict, with variables used in the query as keys, and a tuple of# (ValueType, value) as value.print(f'a: {r["a"][1]:20s} b: {r["b"][1]:10s}')

Outputs something along the lines:

 1 : extractTriples
2 : updateSoprano
4 : inferRules
5 : <unnamed rule>
6 : <unnamed rule>
a: sempr:Entity_0 b: ex:blub
a: ex:foo b: ex:baz

Also, take a look at test/test.py, where I test stuff during development.

About

Python bindings for sempr & rete

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

23 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

sempr-python

This project provides a small python wrapper for sempr. Be aware that is not feature-complete, and its usage is in many aspects different from the C++ version. What did you expect? This is python! 😉

Installation

This project uses pybind11 to create the python extension module:

pip install pybind11

Although a CMakeLists.txt is present (and you are free to use it, if you want -- personally, I'm using it during development with my PYTHONPATH pointed to the build directory), the compilation and installation is handled by the setup.py:

python setup.py build
python setup.py install

If it fails to find pybind11 in the process, you'll need to specify its location. In my case, like this:

pybind11_DIR=~/pythonenv/lib/python3.6/site-packages/pybind11/share/cmake/pybind11 python setup.py build
python setup.py install

Now you are good to go!

But wait, there is more: Out of the box, many python IDEs do not support code completion and the like for binary modules. I'm using vscode with pylance and struggled a bit to get it all working, so here is what worked for me in the end:

After having installed semprpy, you will need to create stubs for semprpy anywhere on your system (does not need to happen inside the semprpy repository). There are several different methods out there to do this, and what worked in the end for me was using either mypy or pybind11-stubgen.

Note: I struggled a lot to get it all working, but as usual, it is quite simple if you know how. I first got it working with mypy, but noticed that it did not export any documentation, only the signatures. Hence, I gave pybind11-stubgen another try, and that works just fine now! (The only remaining problem being that I did not include much documentation in the python bindings, yet... but that is something else.)

With pybind11-stubgen

The preferred way right now is to use pybind11-stubgen, as it was specifically made to generate stubs from C-extension-modules created with pybind11. It properly includes documentation and signatures in the stubs.

Note: pybind11-stubgen is being moved into mypy, but at the time of writing this, it still outperforms mypy.

pip install pybind11-stubgen
pybind11-stubgen semprpy

This creates a folder ./stubs which you can add to your IDE as a location for stub files. In vscode with pylance, this looks like this for me: stubpath

With mypy

As already mentioned, pybind11-stubgen should give better results. But if you have any trouble with that, you can also use mypy:

pip install mypy

This includes a script called stubgen which we can use to create stubs for any module, package or source file. In this case, we use it to create stubs for the whole semprpy-package:

stubgen -p semprpy

This creates a folder out/semprpy with your stub files. You can use these in vscode with pylance by adding the path to the out folder to the Python > Analysis: Extra Paths. For me, this looks like this: extrapaths

Usage

The created python extension is called semprpy.

importsemprpyassemprcore=sempr.Core('my_database_folder') # or without parameter to skip persistencecore.loadPlugins()
core.addRules('[true() -> (<ex:foo> <ex:bar> <ex:baz>)]')
core.addRules('[EC<Component>(?e ?c) -> (?e <ex:bar> <ex:blub>)]')
forrincore.rules():
print(f'{r.id:2d} : {r.nameifr.nameelse"<unnamed rule>"}')
entity=sempr.Entity()
core.addEntity(entity)
component=sempr.Component() # base class without data, only for testingentity.addComponent(component)
# as always, inference before queryingcore.performInference()
# sparql queries are available, too - and simplified.# No need to get the RDFPlugin first.# But: This will throw if the plugin is not loaded!results=core.query('SELECT * WHERE { ?a <ex:bar> ?b . }')
forrinresults:
# r is a dict, with variables used in the query as keys, and a tuple of# (ValueType, value) as value.print(f'a: {r["a"][1]:20s} b: {r["b"][1]:10s}')

Outputs something along the lines:

 1 : extractTriples
2 : updateSoprano
4 : inferRules
5 : <unnamed rule>
6 : <unnamed rule>
a: sempr:Entity_0 b: ex:blub
a: ex:foo b: ex:baz

Also, take a look at test/test.py, where I test stuff during development.

About

Python bindings for sempr & rete

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

23 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

sempr-python

This project provides a small python wrapper for sempr. Be aware that is not feature-complete, and its usage is in many aspects different from the C++ version. What did you expect? This is python! 😉

Installation

This project uses pybind11 to create the python extension module:

pip install pybind11

Although a CMakeLists.txt is present (and you are free to use it, if you want -- personally, I'm using it during development with my PYTHONPATH pointed to the build directory), the compilation and installation is handled by the setup.py:

python setup.py build
python setup.py install

If it fails to find pybind11 in the process, you'll need to specify its location. In my case, like this:

pybind11_DIR=~/pythonenv/lib/python3.6/site-packages/pybind11/share/cmake/pybind11 python setup.py build
python setup.py install

Now you are good to go!

But wait, there is more: Out of the box, many python IDEs do not support code completion and the like for binary modules. I'm using vscode with pylance and struggled a bit to get it all working, so here is what worked for me in the end:

After having installed semprpy, you will need to create stubs for semprpy anywhere on your system (does not need to happen inside the semprpy repository). There are several different methods out there to do this, and what worked in the end for me was using either mypy or pybind11-stubgen.

Note: I struggled a lot to get it all working, but as usual, it is quite simple if you know how. I first got it working with mypy, but noticed that it did not export any documentation, only the signatures. Hence, I gave pybind11-stubgen another try, and that works just fine now! (The only remaining problem being that I did not include much documentation in the python bindings, yet... but that is something else.)

With pybind11-stubgen

The preferred way right now is to use pybind11-stubgen, as it was specifically made to generate stubs from C-extension-modules created with pybind11. It properly includes documentation and signatures in the stubs.

Note: pybind11-stubgen is being moved into mypy, but at the time of writing this, it still outperforms mypy.

pip install pybind11-stubgen
pybind11-stubgen semprpy

This creates a folder ./stubs which you can add to your IDE as a location for stub files. In vscode with pylance, this looks like this for me: stubpath

With mypy

As already mentioned, pybind11-stubgen should give better results. But if you have any trouble with that, you can also use mypy:

pip install mypy

This includes a script called stubgen which we can use to create stubs for any module, package or source file. In this case, we use it to create stubs for the whole semprpy-package:

stubgen -p semprpy

This creates a folder out/semprpy with your stub files. You can use these in vscode with pylance by adding the path to the out folder to the Python > Analysis: Extra Paths. For me, this looks like this: extrapaths

Usage

The created python extension is called semprpy.

importsemprpyassemprcore=sempr.Core('my_database_folder') # or without parameter to skip persistencecore.loadPlugins()
core.addRules('[true() -> (<ex:foo> <ex:bar> <ex:baz>)]')
core.addRules('[EC<Component>(?e ?c) -> (?e <ex:bar> <ex:blub>)]')
forrincore.rules():
print(f'{r.id:2d} : {r.nameifr.nameelse"<unnamed rule>"}')
entity=sempr.Entity()
core.addEntity(entity)
component=sempr.Component() # base class without data, only for testingentity.addComponent(component)
# as always, inference before queryingcore.performInference()
# sparql queries are available, too - and simplified.# No need to get the RDFPlugin first.# But: This will throw if the plugin is not loaded!results=core.query('SELECT * WHERE { ?a <ex:bar> ?b . }')
forrinresults:
# r is a dict, with variables used in the query as keys, and a tuple of# (ValueType, value) as value.print(f'a: {r["a"][1]:20s} b: {r["b"][1]:10s}')

Outputs something along the lines:

 1 : extractTriples
2 : updateSoprano
4 : inferRules
5 : <unnamed rule>
6 : <unnamed rule>
a: sempr:Entity_0 b: ex:blub
a: ex:foo b: ex:baz

Also, take a look at test/test.py, where I test stuff during development.

About

Python bindings for sempr & rete

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

23 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

sempr-python

This project provides a small python wrapper for sempr. Be aware that is not feature-complete, and its usage is in many aspects different from the C++ version. What did you expect? This is python! 😉

Installation

This project uses pybind11 to create the python extension module:

pip install pybind11

Although a CMakeLists.txt is present (and you are free to use it, if you want -- personally, I'm using it during development with my PYTHONPATH pointed to the build directory), the compilation and installation is handled by the setup.py:

python setup.py build
python setup.py install

If it fails to find pybind11 in the process, you'll need to specify its location. In my case, like this:

pybind11_DIR=~/pythonenv/lib/python3.6/site-packages/pybind11/share/cmake/pybind11 python setup.py build
python setup.py install

Now you are good to go!

But wait, there is more: Out of the box, many python IDEs do not support code completion and the like for binary modules. I'm using vscode with pylance and struggled a bit to get it all working, so here is what worked for me in the end:

After having installed semprpy, you will need to create stubs for semprpy anywhere on your system (does not need to happen inside the semprpy repository). There are several different methods out there to do this, and what worked in the end for me was using either mypy or pybind11-stubgen.

Note: I struggled a lot to get it all working, but as usual, it is quite simple if you know how. I first got it working with mypy, but noticed that it did not export any documentation, only the signatures. Hence, I gave pybind11-stubgen another try, and that works just fine now! (The only remaining problem being that I did not include much documentation in the python bindings, yet... but that is something else.)

With pybind11-stubgen

The preferred way right now is to use pybind11-stubgen, as it was specifically made to generate stubs from C-extension-modules created with pybind11. It properly includes documentation and signatures in the stubs.

Note: pybind11-stubgen is being moved into mypy, but at the time of writing this, it still outperforms mypy.

pip install pybind11-stubgen
pybind11-stubgen semprpy

This creates a folder ./stubs which you can add to your IDE as a location for stub files. In vscode with pylance, this looks like this for me: stubpath

With mypy

As already mentioned, pybind11-stubgen should give better results. But if you have any trouble with that, you can also use mypy:

pip install mypy

This includes a script called stubgen which we can use to create stubs for any module, package or source file. In this case, we use it to create stubs for the whole semprpy-package:

stubgen -p semprpy

This creates a folder out/semprpy with your stub files. You can use these in vscode with pylance by adding the path to the out folder to the Python > Analysis: Extra Paths. For me, this looks like this: extrapaths

Usage

The created python extension is called semprpy.

importsemprpyassemprcore=sempr.Core('my_database_folder') # or without parameter to skip persistencecore.loadPlugins()
core.addRules('[true() -> (<ex:foo> <ex:bar> <ex:baz>)]')
core.addRules('[EC<Component>(?e ?c) -> (?e <ex:bar> <ex:blub>)]')
forrincore.rules():
print(f'{r.id:2d} : {r.nameifr.nameelse"<unnamed rule>"}')
entity=sempr.Entity()
core.addEntity(entity)
component=sempr.Component() # base class without data, only for testingentity.addComponent(component)
# as always, inference before queryingcore.performInference()
# sparql queries are available, too - and simplified.# No need to get the RDFPlugin first.# But: This will throw if the plugin is not loaded!results=core.query('SELECT * WHERE { ?a <ex:bar> ?b . }')
forrinresults:
# r is a dict, with variables used in the query as keys, and a tuple of# (ValueType, value) as value.print(f'a: {r["a"][1]:20s} b: {r["b"][1]:10s}')

Outputs something along the lines:

 1 : extractTriples
2 : updateSoprano
4 : inferRules
5 : <unnamed rule>
6 : <unnamed rule>
a: sempr:Entity_0 b: ex:blub
a: ex:foo b: ex:baz

Also, take a look at test/test.py, where I test stuff during development.

About

Python bindings for sempr & rete

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

23 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

sempr-python

This project provides a small python wrapper for sempr. Be aware that is not feature-complete, and its usage is in many aspects different from the C++ version. What did you expect? This is python! 😉

Installation

This project uses pybind11 to create the python extension module:

pip install pybind11

Although a CMakeLists.txt is present (and you are free to use it, if you want -- personally, I'm using it during development with my PYTHONPATH pointed to the build directory), the compilation and installation is handled by the setup.py:

python setup.py build
python setup.py install

If it fails to find pybind11 in the process, you'll need to specify its location. In my case, like this:

pybind11_DIR=~/pythonenv/lib/python3.6/site-packages/pybind11/share/cmake/pybind11 python setup.py build
python setup.py install

Now you are good to go!

But wait, there is more: Out of the box, many python IDEs do not support code completion and the like for binary modules. I'm using vscode with pylance and struggled a bit to get it all working, so here is what worked for me in the end:

After having installed semprpy, you will need to create stubs for semprpy anywhere on your system (does not need to happen inside the semprpy repository). There are several different methods out there to do this, and what worked in the end for me was using either mypy or pybind11-stubgen.

Note: I struggled a lot to get it all working, but as usual, it is quite simple if you know how. I first got it working with mypy, but noticed that it did not export any documentation, only the signatures. Hence, I gave pybind11-stubgen another try, and that works just fine now! (The only remaining problem being that I did not include much documentation in the python bindings, yet... but that is something else.)

With pybind11-stubgen

The preferred way right now is to use pybind11-stubgen, as it was specifically made to generate stubs from C-extension-modules created with pybind11. It properly includes documentation and signatures in the stubs.

Note: pybind11-stubgen is being moved into mypy, but at the time of writing this, it still outperforms mypy.

pip install pybind11-stubgen
pybind11-stubgen semprpy

This creates a folder ./stubs which you can add to your IDE as a location for stub files. In vscode with pylance, this looks like this for me: stubpath

With mypy

As already mentioned, pybind11-stubgen should give better results. But if you have any trouble with that, you can also use mypy:

pip install mypy

This includes a script called stubgen which we can use to create stubs for any module, package or source file. In this case, we use it to create stubs for the whole semprpy-package:

stubgen -p semprpy

This creates a folder out/semprpy with your stub files. You can use these in vscode with pylance by adding the path to the out folder to the Python > Analysis: Extra Paths. For me, this looks like this: extrapaths

Usage

The created python extension is called semprpy.

importsemprpyassemprcore=sempr.Core('my_database_folder') # or without parameter to skip persistencecore.loadPlugins()
core.addRules('[true() -> (<ex:foo> <ex:bar> <ex:baz>)]')
core.addRules('[EC<Component>(?e ?c) -> (?e <ex:bar> <ex:blub>)]')
forrincore.rules():
print(f'{r.id:2d} : {r.nameifr.nameelse"<unnamed rule>"}')
entity=sempr.Entity()
core.addEntity(entity)
component=sempr.Component() # base class without data, only for testingentity.addComponent(component)
# as always, inference before queryingcore.performInference()
# sparql queries are available, too - and simplified.# No need to get the RDFPlugin first.# But: This will throw if the plugin is not loaded!results=core.query('SELECT * WHERE { ?a <ex:bar> ?b . }')
forrinresults:
# r is a dict, with variables used in the query as keys, and a tuple of# (ValueType, value) as value.print(f'a: {r["a"][1]:20s} b: {r["b"][1]:10s}')

Outputs something along the lines:

 1 : extractTriples
2 : updateSoprano
4 : inferRules
5 : <unnamed rule>
6 : <unnamed rule>
a: sempr:Entity_0 b: ex:blub
a: ex:foo b: ex:baz

Also, take a look at test/test.py, where I test stuff during development.

About

Python bindings for sempr & rete

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

23 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

sempr-python

This project provides a small python wrapper for sempr. Be aware that is not feature-complete, and its usage is in many aspects different from the C++ version. What did you expect? This is python! 😉

Installation

This project uses pybind11 to create the python extension module:

pip install pybind11

Although a CMakeLists.txt is present (and you are free to use it, if you want -- personally, I'm using it during development with my PYTHONPATH pointed to the build directory), the compilation and installation is handled by the setup.py:

python setup.py build
python setup.py install

If it fails to find pybind11 in the process, you'll need to specify its location. In my case, like this:

pybind11_DIR=~/pythonenv/lib/python3.6/site-packages/pybind11/share/cmake/pybind11 python setup.py build
python setup.py install

Now you are good to go!

But wait, there is more: Out of the box, many python IDEs do not support code completion and the like for binary modules. I'm using vscode with pylance and struggled a bit to get it all working, so here is what worked for me in the end:

After having installed semprpy, you will need to create stubs for semprpy anywhere on your system (does not need to happen inside the semprpy repository). There are several different methods out there to do this, and what worked in the end for me was using either mypy or pybind11-stubgen.

Note: I struggled a lot to get it all working, but as usual, it is quite simple if you know how. I first got it working with mypy, but noticed that it did not export any documentation, only the signatures. Hence, I gave pybind11-stubgen another try, and that works just fine now! (The only remaining problem being that I did not include much documentation in the python bindings, yet... but that is something else.)

With pybind11-stubgen

The preferred way right now is to use pybind11-stubgen, as it was specifically made to generate stubs from C-extension-modules created with pybind11. It properly includes documentation and signatures in the stubs.

Note: pybind11-stubgen is being moved into mypy, but at the time of writing this, it still outperforms mypy.

pip install pybind11-stubgen
pybind11-stubgen semprpy

This creates a folder ./stubs which you can add to your IDE as a location for stub files. In vscode with pylance, this looks like this for me: stubpath

With mypy

As already mentioned, pybind11-stubgen should give better results. But if you have any trouble with that, you can also use mypy:

pip install mypy

This includes a script called stubgen which we can use to create stubs for any module, package or source file. In this case, we use it to create stubs for the whole semprpy-package:

stubgen -p semprpy

This creates a folder out/semprpy with your stub files. You can use these in vscode with pylance by adding the path to the out folder to the Python > Analysis: Extra Paths. For me, this looks like this: extrapaths

Usage

The created python extension is called semprpy.

importsemprpyassemprcore=sempr.Core('my_database_folder') # or without parameter to skip persistencecore.loadPlugins()
core.addRules('[true() -> (<ex:foo> <ex:bar> <ex:baz>)]')
core.addRules('[EC<Component>(?e ?c) -> (?e <ex:bar> <ex:blub>)]')
forrincore.rules():
print(f'{r.id:2d} : {r.nameifr.nameelse"<unnamed rule>"}')
entity=sempr.Entity()
core.addEntity(entity)
component=sempr.Component() # base class without data, only for testingentity.addComponent(component)
# as always, inference before queryingcore.performInference()
# sparql queries are available, too - and simplified.# No need to get the RDFPlugin first.# But: This will throw if the plugin is not loaded!results=core.query('SELECT * WHERE { ?a <ex:bar> ?b . }')
forrinresults:
# r is a dict, with variables used in the query as keys, and a tuple of# (ValueType, value) as value.print(f'a: {r["a"][1]:20s} b: {r["b"][1]:10s}')

Outputs something along the lines:

 1 : extractTriples
2 : updateSoprano
4 : inferRules
5 : <unnamed rule>
6 : <unnamed rule>
a: sempr:Entity_0 b: ex:blub
a: ex:foo b: ex:baz

Also, take a look at test/test.py, where I test stuff during development.

About

Python bindings for sempr & rete

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

23 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

sempr-python

This project provides a small python wrapper for sempr. Be aware that is not feature-complete, and its usage is in many aspects different from the C++ version. What did you expect? This is python! 😉

Installation

This project uses pybind11 to create the python extension module:

pip install pybind11

Although a CMakeLists.txt is present (and you are free to use it, if you want -- personally, I'm using it during development with my PYTHONPATH pointed to the build directory), the compilation and installation is handled by the setup.py:

python setup.py build
python setup.py install

If it fails to find pybind11 in the process, you'll need to specify its location. In my case, like this:

pybind11_DIR=~/pythonenv/lib/python3.6/site-packages/pybind11/share/cmake/pybind11 python setup.py build
python setup.py install

Now you are good to go!

But wait, there is more: Out of the box, many python IDEs do not support code completion and the like for binary modules. I'm using vscode with pylance and struggled a bit to get it all working, so here is what worked for me in the end:

After having installed semprpy, you will need to create stubs for semprpy anywhere on your system (does not need to happen inside the semprpy repository). There are several different methods out there to do this, and what worked in the end for me was using either mypy or pybind11-stubgen.

Note: I struggled a lot to get it all working, but as usual, it is quite simple if you know how. I first got it working with mypy, but noticed that it did not export any documentation, only the signatures. Hence, I gave pybind11-stubgen another try, and that works just fine now! (The only remaining problem being that I did not include much documentation in the python bindings, yet... but that is something else.)

With pybind11-stubgen

The preferred way right now is to use pybind11-stubgen, as it was specifically made to generate stubs from C-extension-modules created with pybind11. It properly includes documentation and signatures in the stubs.

Note: pybind11-stubgen is being moved into mypy, but at the time of writing this, it still outperforms mypy.

pip install pybind11-stubgen
pybind11-stubgen semprpy

This creates a folder ./stubs which you can add to your IDE as a location for stub files. In vscode with pylance, this looks like this for me: stubpath

With mypy

As already mentioned, pybind11-stubgen should give better results. But if you have any trouble with that, you can also use mypy:

pip install mypy

This includes a script called stubgen which we can use to create stubs for any module, package or source file. In this case, we use it to create stubs for the whole semprpy-package:

stubgen -p semprpy

This creates a folder out/semprpy with your stub files. You can use these in vscode with pylance by adding the path to the out folder to the Python > Analysis: Extra Paths. For me, this looks like this: extrapaths

Usage

The created python extension is called semprpy.

importsemprpyassemprcore=sempr.Core('my_database_folder') # or without parameter to skip persistencecore.loadPlugins()
core.addRules('[true() -> (<ex:foo> <ex:bar> <ex:baz>)]')
core.addRules('[EC<Component>(?e ?c) -> (?e <ex:bar> <ex:blub>)]')
forrincore.rules():
print(f'{r.id:2d} : {r.nameifr.nameelse"<unnamed rule>"}')
entity=sempr.Entity()
core.addEntity(entity)
component=sempr.Component() # base class without data, only for testingentity.addComponent(component)
# as always, inference before queryingcore.performInference()
# sparql queries are available, too - and simplified.# No need to get the RDFPlugin first.# But: This will throw if the plugin is not loaded!results=core.query('SELECT * WHERE { ?a <ex:bar> ?b . }')
forrinresults:
# r is a dict, with variables used in the query as keys, and a tuple of# (ValueType, value) as value.print(f'a: {r["a"][1]:20s} b: {r["b"][1]:10s}')

Outputs something along the lines:

 1 : extractTriples
2 : updateSoprano
4 : inferRules
5 : <unnamed rule>
6 : <unnamed rule>
a: sempr:Entity_0 b: ex:blub
a: ex:foo b: ex:baz

Also, take a look at test/test.py, where I test stuff during development.

About

Python bindings for sempr & rete

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

23 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

sempr-python

This project provides a small python wrapper for sempr. Be aware that is not feature-complete, and its usage is in many aspects different from the C++ version. What did you expect? This is python! 😉

Installation

This project uses pybind11 to create the python extension module:

pip install pybind11

Although a CMakeLists.txt is present (and you are free to use it, if you want -- personally, I'm using it during development with my PYTHONPATH pointed to the build directory), the compilation and installation is handled by the setup.py:

python setup.py build
python setup.py install

If it fails to find pybind11 in the process, you'll need to specify its location. In my case, like this:

pybind11_DIR=~/pythonenv/lib/python3.6/site-packages/pybind11/share/cmake/pybind11 python setup.py build
python setup.py install

Now you are good to go!

But wait, there is more: Out of the box, many python IDEs do not support code completion and the like for binary modules. I'm using vscode with pylance and struggled a bit to get it all working, so here is what worked for me in the end:

After having installed semprpy, you will need to create stubs for semprpy anywhere on your system (does not need to happen inside the semprpy repository). There are several different methods out there to do this, and what worked in the end for me was using either mypy or pybind11-stubgen.

Note: I struggled a lot to get it all working, but as usual, it is quite simple if you know how. I first got it working with mypy, but noticed that it did not export any documentation, only the signatures. Hence, I gave pybind11-stubgen another try, and that works just fine now! (The only remaining problem being that I did not include much documentation in the python bindings, yet... but that is something else.)

With pybind11-stubgen

The preferred way right now is to use pybind11-stubgen, as it was specifically made to generate stubs from C-extension-modules created with pybind11. It properly includes documentation and signatures in the stubs.

Note: pybind11-stubgen is being moved into mypy, but at the time of writing this, it still outperforms mypy.

pip install pybind11-stubgen
pybind11-stubgen semprpy

This creates a folder ./stubs which you can add to your IDE as a location for stub files. In vscode with pylance, this looks like this for me: stubpath

With mypy

As already mentioned, pybind11-stubgen should give better results. But if you have any trouble with that, you can also use mypy:

pip install mypy

This includes a script called stubgen which we can use to create stubs for any module, package or source file. In this case, we use it to create stubs for the whole semprpy-package:

stubgen -p semprpy

This creates a folder out/semprpy with your stub files. You can use these in vscode with pylance by adding the path to the out folder to the Python > Analysis: Extra Paths. For me, this looks like this: extrapaths

Usage

The created python extension is called semprpy.

importsemprpyassemprcore=sempr.Core('my_database_folder') # or without parameter to skip persistencecore.loadPlugins()
core.addRules('[true() -> (<ex:foo> <ex:bar> <ex:baz>)]')
core.addRules('[EC<Component>(?e ?c) -> (?e <ex:bar> <ex:blub>)]')
forrincore.rules():
print(f'{r.id:2d} : {r.nameifr.nameelse"<unnamed rule>"}')
entity=sempr.Entity()
core.addEntity(entity)
component=sempr.Component() # base class without data, only for testingentity.addComponent(component)
# as always, inference before queryingcore.performInference()
# sparql queries are available, too - and simplified.# No need to get the RDFPlugin first.# But: This will throw if the plugin is not loaded!results=core.query('SELECT * WHERE { ?a <ex:bar> ?b . }')
forrinresults:
# r is a dict, with variables used in the query as keys, and a tuple of# (ValueType, value) as value.print(f'a: {r["a"][1]:20s} b: {r["b"][1]:10s}')

Outputs something along the lines:

 1 : extractTriples
2 : updateSoprano
4 : inferRules
5 : <unnamed rule>
6 : <unnamed rule>
a: sempr:Entity_0 b: ex:blub
a: ex:foo b: ex:baz

Also, take a look at test/test.py, where I test stuff during development.

About

Python bindings for sempr & rete

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages