第 29 章 促进 Neo4j 发展
Neo4j工程是一个致力于带给我们快速复杂数据存储的开源工程。任何形式的帮助都是社区高度赞赏的 - 你不是一个人在战斗,请参考:贡献者列表!
贡献给Neo4j工程的一个关键方面,请参考:CLA协议。
简而言之:确保签署CLA协议并通过邮件发送给我们否则Neo4j工程不能接收你的贡献信息。
注意你也能贡献文档或者在当前页面提出你的反馈来给社区做贡献。基本上,在你能得到帮助的任何地方,都有你贡献的机会。
如果你想为社区作贡献,可以从一些好的领域开始,特别要与社区联系,请参考:社区支持。
如果你想在文档方面作贡献,我们非常推荐你先阅读:社区文档。
29.1. 贡献者许可协议
我们要求所有托管在Neo4j上面的源代码都必须通过 Neo4j Contributor License Agreement (CLA)贡献出来。这个协议的目的是为了保护完整的代码库,反过来也保护代码库周围的社区:创始公司Neo Technology,Neo4j开发社区以及Neo4j用户。 贡献者协议类型跟很多开源软件和开源工程类似(实际上,他非常类似于广泛签署的 Oracle Contributor Agreement)。
如果你没有CLA协议的其他任何问题,请继续浏览下面的内容或者发送邮件到地址: admins@neofourjay.org 。如果你有一个法律问题,请咨询律师。
29.1.2. 一般问题我会失去我自己代码的权利吗?
不会,Neo4j CLA只要求你共享你的权利,而不是要你放弃你的权利。不像一些贡献协议,要求您转移到另一个组织的版权。CLA并不会带走你的知识产权。当你同意CLA协议时,您授予我们共同拥有版权以及你的贡献的一个专利授权。你保留所有权利,所有权和利益,你可以把它们用正你任何你希望的地方。除了撤销我们的权利,你还可以对你的代码做任何事情。
你们会如何处理我贡献的东西?
我们可以行使版权持有人的所有权利,以及拥有您在Neo4j CLA中授权给我们的你拥有的权利。在CLA提供的联合版权的所有权中,在你的贡献上,你可行使和我们相同的权利。
为此社区会提供什么福利?
嗯,它可以让我们赞助Neo4j重点项目和为社区提供基础设施,以便缺博啊我们能引入这些到软件中,我们发送给我们的客户没有任何讨厌的惊喜。没有这个能力,我们作为一个小公司将很难发布我们所有的代码作为免费软件。
而且,CLA协议让阿功能我们保护社区成员(包括开发者和用户)在有需要时面对有敌意的知识产品诉讼。这是与其他自由软件管家维护项目(除了与自由软件基金会(FSF),没有共享的版权而是你完全签署的FSF)是一样的,比如 Free Software Foundation - FSF。贡献者协议页包括一份"自由软件公约"或者说一个承诺:贡献的东西将保持作为免费软件。
直到最后,你仍然保留你的贡献的所有权利而我们非常有信息的说:我们能保护Neo4j社区以及Neo4j公司的客户。
我们可以讨论一些CLA里面的条款吗?
绝对可以的!请告诉我们你的反馈!But let’s keep the legalese off the mailing lists。请把你的反馈信息直接发送邮件到 cla (@t) neotechnology.com,我们会尽快回复你的。
我仍然不喜欢CLA协议。
好的,当然你也可以把你的代码或者稳定托管到其他任何地方。请不要! 我们只是在这讨论下我们提供的基础设施的规则而已。
29.1.3. 如何签署CLA协议
当你已经阅读完了CLA,请你发送一份邮件到:cla (@t) neotechnology.com。包括下面一些信息:
你的完整姓名(包括中文名和英文名)。
你的常用电子邮件。
Neo4j CLA协议的一份拷贝作为附件发送。
你同意这个协议的表述。
举个例子:
Hi. My name is John Doe (john@doe.com).
29.2. 可以贡献的领域
29.2.1. Neo4j发布
29.2.2. 维护Neo4j文档
29.2.3. Neo4j的客户端驱动以及绑定
Neo4j是一个高速成长并有大量贡献空间的项目。在这里你可以和全情投入,当然取决于你的时间,技能和兴趣。下面是一些你可能感兴趣的领域:
29.2.1. Neo4j发布
Neo4j社区版问题讨论,适合刚开始为社区作贡献的成员。
查看 GitHub Neo4j项目获取所有的Neo4j工程。
29.2.2. 维护Neo4j文档
文档的某些部分需要额外维护来保持与社区同步更新。他们通常是指不同的社区贡献。下面有一个清单,正那儿你可以随时研究和检查过时的或缺少的内容!为社区做贡献的最简单方式是直接在 在线HTML版本发表评论。
第 5 章 Neo4j远程客户端库
29.2.3. Neo4j的客户端驱动以及绑定
REST: 查看 第 5 章 Neo4j远程客户端库获取当前活跃的社区项目。
29.3. 撰写Neo4j开发文档
注意:比起撰写文档,你也可以通过在 在线HTML版本页面提交评论来帮助我们。
要获取如何编译手册,请参考: 编译说明。
文档采用了asciidoc格式,请参考:
Aciidoc 参考手册
AsciiDoc 速记卡
这个速记卡真的非常棒!
29.3.1. 总体流程
每一个项目或者子项目都有它自己的文档,会生成到一个'docs.jar'文件中。默认情况下,这个文件从'src/docs/'目录的内容组装而成。 Asciidoc文档的扩展名是 .txt 。
文档可以使用来自项目的扩展代码的代码片段。相应的代码必须部署到sources.jar 或者 'test-sources.jar'文件中。
通过建立相应的单元测试,文档可以正JavaDoc备注中直接书写。
上面的文件都用来构建手册(通过增加它们作为依赖)使用。为了得到包括在手册中的内容,它必须被明确列入是手册中的文件。
注意为不同场景增加文档工作的不同方法:
为了生成详细的文档, 必须把文档写来作为单元测试的一部分(包括在JavaDoc中)。 在这种情况下,你一般不想在文档中链接到源代码。
为了教学级的文档,通过书写一个 .txt 的文件来包括在文本中是最好的方式。 源码片段和输出范例都能从那个地方引入。 在这种情况下,你一般想链接到源代码,而用户应该能不用任何额外的设置就可以运行它。
29.3.2. 在'docs.jar'中的文件结构
目录 内容
dev/
面向开发人员的内容
dev/images/
面向开发人员的内容需要的图片
ops/
面向管理员的内容
ops/images/
面向管理员的内容需要的图片
man/
联机帮助页
额外子目录被用来作为文档所必须的结构,比如'dev/tutorial/','ops/tutorial/'等等。
29.3.3. 标题和文档结构
每一个文档都带有标题并从等级0开始。每一个文档应该有一个ID。在一些情况下,在文档中的片段也需要它们的ID,这依赖与它们是否会填充到整体结构中。为了能链接到这些内容,必须有一个ID。在强制性地方如果缺少ID在构建时将会失败。
这是一个文档的开始:
1
2
3 [[unique-id-verbose-is-ok]]
文档标题
====
为了把标题放到正确的等级下面,当在一个文件中引入另外文件时,属性 leveloffset 将会被使用。
Subsequent headings in a document should use the following syntax:
... 这是内容 ...
=== 三级标题 ===
这是内容 ...
Asciidoc对头部分的语法不止一个,但在这个项目中它不会被使用。
29.3.4. 撰写
一行写一句。这让很容易移动内容,并且很容易分拆长句。
29.3.5. 陷阱
一个章节不能是空的。 (构建时做 docbook xml合法性校验时会失败)。
文档标题应该有下划线, 由与标题字符个数相同的 = 组成。
在文档末尾总是留一个空行 (或者说下一个文档的标题会在 文档的最后一段后结束)。
因为 {} 用来作为Asciidoc的属性,每一个内嵌正里面的都被认为是一个属性。 当你必须用它的时候,请使用:+\{+。 如果你不这样做,在没有任何提示或者警告的情况下,括号里面的文字会被移除。
29.3.6. 链接
为了链接到手册给定Id的其他部分,下面展示如何链接到一个参考页面:
1 <<community-docs-overall-flow>>
输出结果:第 29.3.1 节 “总体流程”
注意
只需要简单写 "看 <<target-id>>" ,在大多数情况下,这应该足够。
如果你修养链接到其他你自定义链接文本的文档,如下操作:
1 <<target-id, link text that fits in the context>>
注意
有大量的链接文本在web环境工作得很好但普通文本用于打印,而我们的目标是两个都可以。
外部链接如下:
1 http://neo4j.org/[Link text here]
输出像这样: Link text here
对于一个短地址可能不需要增加链接文本,像这样:
1 http://neo4j.org/
输出像这样: http://neo4j.org/
注意
在链接后面有一个标点符号是不受影响的,它不会被认为是链接的一部分。
29.3.7. 文本格式
_Italics_ 显示为 Italics 表示重点。
*Bold* 显示为 Bold 用来加强,仅用于加强重点。
+methodName()+ 显示为 methodName() 也被用于文字 (注意:在 + 符号之间的文字 会 被解析)。
`command` 显示为 command (一般用于命令行)。 (注意:在 ` 符号之间的文字 会 被解析)。
'my/path/' 显示为 my/path/ (用来表示文件名或者路径)。
``Double quoted'' (that is two grave accents to the left and two acute accents to the right) 表示为 ‘`Double quoted’'。
`Single quoted' (that is a single grave accent to the left and a single acute accent to the right) 表示为 `Single quoted'。
29.3.9. 图片
重要
正整个手册中的图片都有相同的命名空间。 你指定如何管理控制它们。
图片文件
为了引入一个图片文件,确保图包括在文档目录的子目录'images/'中,然后,你可以:
1 image::neo4j-logo.png[]
输出结果:
静态的Graphviz/ DOT
我们使用Graphviz/DOT语言来描述图数据库。要获取更多的细节,请参考:http://graphviz.org/。
这是如何引入一个简单范例数据库:
1
2
3
4 ["dot", "community-docs-graphdb-rels.svg"]
----
"开始节点" -> "结束节点" [label="关系"]
----
输出结果:
这儿是一个在构建中使用一些预置参数的范例:
10 ["dot", "community-docs-graphdb-rels-overview.svg", "meta"]
----
"A Relationship" [fillcolor="NODEHIGHLIGHT"]
"Start node" [fillcolor="NODE2HIGHLIGHT"]
"A Relationship" -> "Start node" [label="has a"]
"A Relationship" -> "End node" [label="has a"]
"A Relationship" -> "Relationship type" [label="has a"]
Name [TEXTNODE]
"Relationship type" -> Name [label="uniquely identified by" color="EDGEHIGHLIGHT" fontcolor="EDGEHIGHLIGHT"]
----
输出结果:
传递给点过滤器的可选第二个参数定义了使用的风格:
当没定义时: 节点空间的默认样式。
neoviz: 通过Neoviz生成节点空间样式。
meta: 图数据库不会显示内容,更像是展示概念。
小心
DOT语言的关键字用于其他用途时,必须用双引号括起来。 关键字包括: node, edge, graph, digraph, subgraph, 和 strict.
29.3.10. 属性
你能在文档中使用的普通属性:
{neo4j-version} - 表示为 "1.8"
{neo4j-git-tag} - 表示为 "1.8"
{lucene-version} - 表示为 "3_5_0"
这些可以用来替代指向范例 APIDocs或者源代码的URL的部分。注意neo4j-git-tag也能控制snapshot/master。
能被使用的Asciidoc范例属性:
{docdir} - 指向文档的根目录
{nbsp} - 不间断空格
29.3.11. 备注
有一个独立的构件来引入备注。备注用一个黄色背景表示。默认它是不会被构建的,但在一个普通构建之后,你可以使用 make annotated 来构建它。你也能使用结果页来搜索内容,以及在一个单页面上的完整手册。
下面是范例:
1 // this is a comment
备注在一般构建结果文档中是不可见的。备注块根本不会包括在任何构建输出里面。这是一个范例:
4 ////
Note that includes in here will still be processed, but not make it into the output.
That is, missing includes here will still break the build!
////
29.3.12. 代码片段在文件中明确定义
警告
尽可能少的使用代码片段。 众所周知的,它们以及很长时间没有更新了。
下面是范例:
4 [source,cypher]
----
start n=(2, 1) where (n.age < 30 and n.name = "Tobias") or not(n.name = "Tobias") return n
----
输出结果:
1 start n=(2, 1) where (n.age < 30 and n.name = "Tobias") or not(n.name = "Tobias") return n
如果没有合适的高亮语法,就省略语言设置: +[source]+。
目前下面的语言的高亮是支持的:
Bash
Cypher
Groovy
Java
JavaScript
Python
XML
更多我们能使用的高亮语言,请参考: http://alexgorbatchev.com/SyntaxHighlighter/manual/brushes/ 。
源代码中抽取
代码可以自动的从源文件中抽取。你需要定义:
component: Maven坐标的 artifactId 。
source: 指向部署的jar文件的文件路径。
classifier: sources 或者 test-sources 或者任何指向构件的分类。
tag: 用于搜索文件的tag标签。
代码语言,如果需要相应的语法高亮显示。
注意构件必须作为一个手册项目的Maven依赖被引入以便文件可以被找到。
注意标签“ABC”将匹配“ABCD”。有一个非常简单的 on/off开关,让多个出现的装配进一个单独的代码片段输出。这个行为能被用户用来当来自代码范例测试的时候隐藏断言。
这是一个定义如何包含代码片段的范例:
7 [snippet,java]
----
component=neo4j-examples
source=org/neo4j/examples/JmxTest.java
classifier=test-sources
tag=getStartTime
----
输出结果:
1
8 private static Date getStartTimeFromManagementBean(
GraphDatabaseService graphDbService )
{
GraphDatabaseAPI graphDb = (GraphDatabaseAPI) graphDbService;
Kernel kernel = graphDb.getSingleManagementBean( Kernel.class );
Date startTime = kernel.getKernelStartTime();
return startTime;
}
查询结果
对于Cypher查询结果有一个特殊的过滤器。这是如何标记一个查询结果:
12 .结果
[queryresult]
----
+----------------------------------+
| friend_of_friend.name | count(*) |
+----------------------------------+
| Ian | 2 |
| Derrick | 1 |
| Jill | 1 |
+----------------------------------+
3 rows, 12 ms
----
输出结果:
表 . --docbook
friend_of_friend.name count(*)
3 行, 12 毫秒
Ian
2
Derrick
1
Jill
1
29.3.13. 基于文档测试的一个简单Java范例
对于Java来说,有几个预置工具用来保持代码和文档都在Javadocs和代码片段中,这些代码片段生成了其它工具的的Asciidoc文档。
为了说明这个,看看下面的文档,用文件 hello-world-title.asciidoc 生成的内容是:
59 [[examples-hello-world-sample-chapter]]
Hello world 范例章节
================
这是一个范例文档测试,演示了将代码和其他构件变成Asciidoc表单的不同方法。生成文档的标题由方法名称决定,并用 " " 取代 "+_+" 。
Below you see a number of different ways to generate text from source,
inserting it into the JavaDoc documentation (really being Asciidoc markup)
via the +@@+ snippet markers and programmatic adding with runtime data
in the Java code.
- The annotated graph as http://www.graphviz.org/[GraphViz]-generated visualization:
.你好世界图
["dot", "Hello-World-Graph-hello-world-Sample-Chapter.svg", "neoviz", ""]
----
N1 [
label = "{Node\[1\]|name = \'you\'\l}"
]
N2 [
label = "{Node\[2\]|name = \'I\'\l}"
]
N2 -> N1 [
color = "#2e3436"
fontcolor = "#2e3436"
label = "know\n"
]
----
- 一个Cypher范例查询:
[source,cypher]
----
START n = node(2)
RETURN n
----
- 一个范例文本输出片段:
[source]
----
Hello graphy world!
----
- a generated source link to the original GIThub source for this test:
https://github.com/neo4j/community/blob/{neo4j-git-tag}/embedded-examples/src/test/java/org/neo4j/examples/DocumentationTest.java[DocumentationTest.java]
- The full source for this example as a source snippet, highlighted as Java code:
[snippet,java]
----
component=neo4j-examples
source=org/neo4j/examples/DocumentationTest.java
classifier=test-sources
tag=sampleDocumentation
----
以上是这个章节的全部。
这个文件通过下面的代码被引入到这个文档中:
1
2 :leveloffset: 3
include::{docdir}/examples/dev/examples/hello-world-sample-chapter.asciidoc[]
输出结果:
29.3.14. Hello world 范例章节
这是一个范例文档测试,演示了将代码和其他构件变成Asciidoc表单的不同方法。生成文档的标题由方法名称决定,并用 " " 取代 "_" 。
Below you see a number of different ways to generate text from source, inserting it into the JavaDoc documentation (really being Asciidoc markup) via the @@ snippet markers and programmatic adding with runtime data in the Java code.
The annotated graph as GraphViz-generated visualization:
图 29.1. 你好世界图
一个Cypher范例查询:
1
2 START n = node(2)
RETURN n
一个范例文本输出片段:
1 Hello graphy world!
a generated source link to the original GIThub source for this test:
DocumentationTest.java
The full source for this example as a source snippet, highlighted as Java code:
73 // START SNIPPET: _sampleDocumentation
package org.neo4j.examples;
import org.junit.Test;
import org.neo4j.kernel.impl.annotations.Documented;
import org.neo4j.test.GraphDescription.Graph;
import static org.neo4j.visualization.asciidoc.AsciidocHelper.*;
public class DocumentationTest extends AbstractJavaDocTestbase
{
/**
* This is a sample documentation test, demonstrating different ways of
* bringing code and other artifacts into Asciidoc form. The title of the
* generated document is determined from the method name, replacing "+_+" with
* " ".
*
* Below you see a number of different ways to generate text from source,
* inserting it into the JavaDoc documentation (really being Asciidoc markup)
* via the +@@+ snippet markers and programmatic adding with runtime data
* in the Java code.
*
* - The annotated graph as http://www.graphviz.org/[GraphViz]-generated visualization:
*
* @@graph
*
* - A sample Cypher query:
*
* @@cypher
*
* - A sample text output snippet:
*
* @@output
*
* - a generated source link to the original GIThub source for this test:
*
* @@github
*
* - The full source for this example as a source snippet, highlighted as Java code:
*
* @@sampleDocumentation
*
* This is the end of this chapter.
*/
@Test
// signaling this to be a documentation test
@Documented
// the graph data setup as simple statements
@Graph( "I know you" )
// title is determined from the method name
public void hello_world_Sample_Chapter()
{
// initialize the graph with the annotation data
data.get();
gen.get().addTestSourceSnippets( this.getClass(), "sampleDocumentation" );
gen.get().addGithubTestSourceLink( "github", this.getClass(), "neo4j/community",
"embedded-examples" );
gen.get().addSnippet( "output",
createOutputSnippet( "Hello graphy world!" ) );
gen.get().addSnippet(
"graph",
createGraphVizWithNodeId( "Hello World Graph", graphdb(),
gen.get().getTitle() ) );
// A cypher snippet referring to the generated graph in the start clause
gen.get().addSnippet(
"cypher",
createCypherSnippet( "start n = node(" + data.get().get( "I" ).getId()
+ ") return n" ) );
}
}
// END SNIPPET: _sampleDocumentation
以上是这个章节的全部。
29.3.15. 集成远程控制台
一个交互控制台可以被新增并出现正在线HTML版本中。一个可选的标题被增加,用于按钮的文本。
这里是做法,使用Geoff来定义数据,使用空行来从查询中分割它们:
10 .与黑客帝国交互的范例
[console]
----
(A) {"name" : "Neo"};
(B) {"name" : "Trinity"};
(A)-[:LOVES]->(B)
start n = node(*)
return n
----
输出结果:
29.3.16. 工具链
当配置docbook工具链时一些有用的链接:
http://www.docbook.org/tdg/en/html/docbook.html
http://www.sagehill.net/docbookxsl/index.html
http://docbook.sourceforge.net/release/xsl/1.76.1/doc/html/index.html
http://docbook.sourceforge.net/release/xsl/1.76.1/doc/fo/index.html