
如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
Portable, Serverless & Lightweight
SQLite-based Graph Database
I know you really don't care about long explanations and want to have a look at working code right away, so... here you are (this is the code the creates the graph in the image above):
red;--------------------------------------------- ; Import Grafito ; and ... let's rock'n'roll! :) ;--------------------------------------------- do.import {grafito.art} do [ ;--------------------------------------------- ; Set up a new graph environment ; with a local database named "sample4" ;--------------------------------------------- graph.create "sample4" [ ;--------------------------------------------- ; Populate the database ;--------------------------------------------- uk: put'country [name: "United Kingdom"] au: put'country [name: "Australia"] us: put'country [name: "United States"] ca: put'country [name: "Canada"] nolan: put'person [name: "Christopher Nolan" birthday: 1970 sex: "m"] pearce: put'person [name: "Guy Pearce" birthday: 1967 sex: "m"] hanson: put'person [name: "Curtis Hanson" birthday: 1945 sex: "m"] spacey: put'person [name: "Kevin Spacey" birthday: 1959 sex: "m"] dicaprio: put'person [name: "Leonardo DiCaprio" birthday: 1974 sex: "m"] moss: put'person [name: "Carrie-Ann Moss" birthday: 1967 sex: "f"] wach1: put'person [name: "Lana Wachowski" birthday: 1965 sex: "f"] wach2: put'person [name: "Lilly Wachowski" birthday: 1967 sex: "f"] memento: put'movie [title: "Memento" year: 2000] inception: put'movie [title: "Inception" year: 2010] laconfidential: put'movie [title: "L.A. Confidential" year: 1997] matrix: put'movie [title: "The Matrix" year: 1999] ;--------------------------------------------- ; Define the relationships ; between our nodes ;--------------------------------------------- link'isFrom nolan uk link'isFrom pearce au link'isFrom @[hanson spacey dicaprio wach1 wach2] us link'isFrom moss ca link'directed nolan @[memento inception] link'directed hanson laconfidential link'directed @[wach1 wach2] matrix link'actedIn pearce @[memento laconfidential] link'actedIn spacey laconfidential link'actedIn dicaprio inception link'actedIn moss @[memento matrix] ;--------------------------------------------- ; Fetch every "person" & ; open the Desktop app for visualization ;--------------------------------------------- preview fetch 'person ø ] ]
The easiest way to try Grafito is using Docker (although, without support for the Desktop app - yet)
docker run -it arturolang/grafito
or, if you want to run a specific script:
docker run -it -v $(pwd):/home arturolang/grafito <yourscript>
To install local, first you have to have installed the latest version of https://github.com/arturo-lang/arturo.
Then, just clone this repo and simply go to the folder via your terminal.
As a Library
After having installed the latest version of Arturo, you can use Grafito from any Arturo script as a library.
For example, here's how you run one of the included examples:
arturo examples/sample3.art
As a Standalone tool
Of course, you can also run Grafito as a tool on it own:
./grafito.art <database>
(If you pass a name, it will use it as your database file. If not, the database will be in-memory)
And you can see your lightweight graph engine in action!
redgraph.create "mygraph" [ put'person [name: "John" sex: 'm] ]
redgraph.create "mygraph" [ john: put'person [name: "John" sex: 'm] joan: put'person [name: "Joan" sex: 'f] link 'marriedTo john joan ]
redgraph "mygraph" [ inspect what'person [name: "Joan"] ]
redgraph "mygraph" [ unput what'person [name: "John"] ]
redgraph "mygraph" [ unlink'marriedTo what'person [name: "John"] what'person [name: "Joan"] ]
redgraph "mygraph" [ inspect fetch'person [ sex: "m" marriedTo: what 'person [name: "Joan"] ] ]
Using filters
redgraph "mygraph" [ fetch'person [ surname:"Doe" age: -> greater: 30 ] ]
redgraph "mygraph" [ preview fetch 'person ø ]
(If you run the sample4 in the examples folder, you'll be a minimal movie database. Running the command preview will open up the Desktop app with the image you see above ;-))
All of the following commands must run within a graph environment. In order to set it up, use:
redgraph <database> [ ;; your code goes here ]
⚠️ The
graphcommand is not needed when you run Grafito as a tool, since the "environment" is already set up for you. ;-)
If you pass null (or ø) then the database will be in-memory. If you want to save to a file on disk, then pass a string with the desired database name. If the database already exists, it will be re-opened. If not, it will be created from scratch.
💡 You may force the database to be re-created from scratch, regardless of whether it exists, by setting the
.createattribute. E.g.graph.create "mygraph" [ ;; your code goes here ]
Description
Create a new node of given type and with given properties.
Usage
put type :literal
properties :dictionary
Returns
Examples
redput 'person [name: "John" surname: "Doe" birthday: 1986]
Description
Delete given node
Usage
unput node :dictionary
Examples
redx: put 'person [name: "John" surname: "Doe" birthday: 1986] unput x
Description
Create a new relationship of given type between given nodes.
Usage
link type :literal
source :dictionary (node), :block of :dictionary (node)
target :dictionary (node), :block of :dictionary (node)
Returns
Examples
redlink 'marriedTo put 'person [name: "John" surname: "Doe" birthday: 1986] put 'person [name: "Mary" surname: "Doe" birthday: 1986]
Description
Delete given relationship between given nodes.
Usage
unlink type :literal
source :dictionary (node)
target :dictionary (node)
Examples
redx: put 'person [name: "John" surname: "Doe" birthday: 1986] y: put 'person [name: "Mary" surname: "Doe" birthday: 1986] link 'marriedTo x y unlink 'marriedTo x y
Description
Get the first node of given type, that satisfies all of given properties and/or relationships.
Usage
what type :literal
properties :block :dictionary :null
Returns
Examples
redprint what 'person [name: "John"]
Description
Get all nodes of given type, that satisfy all of given properties and/or relationships.
Usage
fetch type :literal
properties :block :dictionary :null
Returns
Examples
redprint fetch 'person [surname: "Doe"] print fetch 'person [ surname: "Doe" marriedTo: what'person [name: "Mary"] ]
Description
Preview given array of nodes in Desktop app.
Usage
preview nodes :block
Examples
redpreview fetch 'person [surname: "Doe"]
When querying - e.g. with fetch or what - you can search for results, not only for exact matches, but also using one of the filters below.
redfetch'person [ surname: "Doe" ; here, we are looking for an exact match ; that is: people with the surname Doe ]
redfetch'person [ surname: [ contains: "D" ; here, we are using the 'contains filter ; that is: people whose surname contains the letter D ] ]
(The above, using Arturo's powerful syntax, could also be written like:
redfetch'person [ surname: -> contains: "D" ]
Get rows that contain the given text.
Get rows with a numeric value less than the given one.
Get rows with a numeric value greater than the given one.
Get rows with a numeric value less than or equal to the given one.
Get rows with a numeric value greater than or equal to the given one.
Get rows with a value not equal to the given one (or block of given values).
Get rows with a numeric value equal to one of those in the given block.
In case you want to ask a question, suggest an idea, or practically anything related to Grafito (or Arturo) - feel free! Everything and everyone is welcome.
For that, the most convenient place for me would be the https://github.com/arturo-lang/grafito/issues page.
 2021 Yanis Zafirópulos
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务